在 Java 和 SQL 中工作的循环控制流
如果您使用 Java 编写此代码,则可以通过循环控制流语句(例如do-while-loop )来使您的代码执行调用返回不同的有序结果。这个 Wikipedia 参考对使用 Java 和不同编程语言中的实现之间的 do-while-loop 对比进行了很好的讨论。
通过观察获得的一些额外影响:
您使用该Mockrunner
工具的工作线索:
模拟的 select 语句将始终返回与它关联的最后一个结果集(例如,如果我创建了两个 MockResultSets 并将它们与相同的 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小提琴
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
结果:
| 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
结果:
| 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
结果:
| 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
结果:
| 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;
混合字符串和整数值可能不是问题,因为在连接 (+) 值的参考中表明:连接到字符串的任何内容都将转换为字符串(例如,“重量 =”+ 千克)。
特殊案例要求的想法
您可以引入自己的编号顺序,以使每个案例的记录在参考表中循环。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 循环条件。