在 Java 和 SQL 中工作的循环控制流
如果您使用 Java 编写此代码,则可以通过循环控制流语句(例如 do-while-loop)来使您的代码执行调用返回不同的有序结果。这个 Wikipedia 参考对使用 Java 和不同编程语言的实现之间的 do-while-loop 对比进行了很好的讨论。
观察带来的一些额外影响:
您使用Mockrunner 工具的工作线索:
模拟的 select 语句将始终返回与它关联的最后一个结果集(例如,如果我创建了两个 MockResultSet 并将它们与同一个 select stmt 关联)
之所以如此,是因为SELECT 语句实际上也必须更改,否则重复查询也会重复结果输出。一个线索是,您的 SQL 在整个代码执行过程中都以文字字符串值的形式存在。字符串可以通过代码和简单的字符串操作来改变。
String selectSQL = "someselectStmt";
StatementResultSetHandler stmtHandler = conn.GetStatementResultSetHandler();
MockResultSet result = stmtHandler.createResultSet();
result.addRow(new Integer[]{new Integer(1)});
stmtHandler.prepareResultSet(selectSQL, result);
除了selectSQL变量外,还要为数值变量添加一行,以跟踪SQL语句执行了多少次:
Int queryLoopCount = 0;
在以下目标类中:
Integer[] Results = getResults(selectSQL);
while(Results.length != 0){
//do some stuff that change what gets returned in the select stmt
Results = getResults(selectSQL)
}
尝试按照此示例重写此 WHILE 循环控制。在您的伪代码中,您将继续从对 getResults(selectSQL); 的调用中提取相同的数据,因为查询在每次通过代码时都保持不变。
设置测试架构和示例 SQL 语句
这里是使用一个包含“testdata”输出的单个 MySQL 表的小检查,该输出将被馈送到某些结果集中。 ID 列可能是一种唯一标识每个不同记录或“测试用例”的方法
SQL Fiddle
MySQL 5.5.32 架构设置:
CREATE TABLE testCaseData
(
id int primary key,
testdata_col1 int,
testdata_col2 varchar(20),
details varchar(30)
);
INSERT INTO testCaseData
(id, testdata_col1, testdata_col2, details)
VALUES
(1, 2021, 'alkaline gab', 'First Test'),
(2, 322, 'rebuked girdle', '2nd Test'),
(3, 123, 'municipal shunning', '3rd Test'),
(4, 4040, 'regal limerick', 'Skip Test'),
(5, 5550, 'admonished hundredth', '5th Test'),
(6, 98, 'docile pushover', '6th Test'),
(7, 21, 'mousiest festivity', 'Last Test');
commit;
查询 1 查看所有测试数据:
SELECT id, testdata_col1, testdata_col2, details
FROM testCaseData
Results:
| ID | TESTDATA_COL1 | TESTDATA_COL2 | DETAILS |
|----|---------------|----------------------|------------|
| 1 | 2021 | alkaline gab | First Test |
| 2 | 322 | rebuked girdle | 2nd Test |
| 3 | 123 | municipal shunning | 3rd Test |
| 4 | 4040 | regal limerick | Skip Test |
| 5 | 5550 | admonished hundredth | 5th Test |
| 6 | 98 | docile pushover | 6th Test |
| 7 | 21 | mousiest festivity | Last Test |
查询2只查询表中的第一条记录:
SELECT id, testdata_col1, testdata_col2, details
FROM testCaseData
WHERE id = 1
Results:
| ID | TESTDATA_COL1 | TESTDATA_COL2 | DETAILS |
|----|---------------|---------------|------------|
| 1 | 2021 | alkaline gab | First Test |
查询3查询表中的特定测试记录:
SELECT id, testdata_col1, testdata_col2, details
FROM testCaseData
WHERE id = 2
Results:
| ID | TESTDATA_COL1 | TESTDATA_COL2 | DETAILS |
|----|---------------|----------------|----------|
| 2 | 322 | rebuked girdle | 2nd Test |
查询4返回和限制输出集大小:
SELECT id, testdata_col1, testdata_col2, details
FROM testCaseData
WHERE id < 5
Results:
| ID | TESTDATA_COL1 | TESTDATA_COL2 | DETAILS |
|----|---------------|--------------------|------------|
| 1 | 2021 | alkaline gab | First Test |
| 2 | 322 | rebuked girdle | 2nd Test |
| 3 | 123 | municipal shunning | 3rd Test |
| 4 | 4040 | regal limerick | Skip Test |
编写参数化 SQL 语句
我不知道这种语法差异是否会产生与您的伪代码完全相同的结果,但我建议从我知道已经工作的代码结构的引用中使用它。
set condition value before loop
do{
// do some work
// update condition value
}while(condition);
WHILE 条件位于语句的末尾,并且应该基于对循环块内的值的更改。我们现在将介绍第二个变量,一个 int,它跟踪循环的迭代次数:
String selectSQL = "someselectStmt";
String[] Results; = getResults(selectSQL);
// set condition value before loop
queryLoopCount = 0
do{
// do some work
Results = getResults(selectSQL);
// update condition value
queryLoopCount = queryLoopcount + 1;
}while(queryLoopCount < 6);
selectSQL 来自哪里:
SELECT id, testdata_col1, testdata_col2, details
FROM testCaseData
WHERE id = 2;
并使用内置参数适应:
selectSQL = 'SELECT id, testdata_col1, testdata_col2, details
FROM testCaseData
WHERE id = ' + queryLoopCount;
混合字符串和整数值可能不是问题,因为this reference on concatenated(+) 值表明:任何连接到字符串的内容都会转换为字符串(例如,“重量 =”+ 千克)。
特殊案例要求的想法
您可以引入自己的编号顺序来获取每个案例的记录以循环浏览参考表。通过引入ORDER BY 语句并更改键ORDER BY 值有很多可能性。
-
“跳过”案例。在 Do-While 循环中,添加 IF-THEN 语句以有条件地跳过特定记录。
set condition value before loop
do{
if ( queryLoopCount <> 4 ) {
// do some work}
// update condition value
queryLoopCount = queryLoopCount + 1;
}while(condition);
使用 if-then 循环,此代码示例将处理所有测试记录,但会跳过 ID = 4 的记录并继续执行,直到满足 while 循环条件。