在oracle pro * c / c ++
中EXEC SQL WHENEVER SQLERROR DO break;
这句话实际上做了什么?这会在以下所有exec sql语句中插入break语句吗?
如何限制do break的范围?
答案 0 :(得分:2)
DO BREAK
实际的"休息"声明放在您的程序中。在循环中使用此操作。当满足WHENEVER条件时,程序将退出其内部的循环。
因此,每当遇到错误时,都会发出break
,这在循环之外并不意味着很多。如果要在特定语句之后重置行为,请发出EXEC SQL WHENEVER SQLERROR CONTINUE;
以重置为默认错误处理行为:
CONTINUE
如果可能,您的程序将继续运行下一个语句。这是默认操作,相当于不使用WHENEVER指令。您可以使用它来关闭条件检查。
实际上,您可以将两个WHENEVER
指令之间的语句夹在中间,使其仅适用于该语句。
答案 1 :(得分:2)
该语句的工作方式类似于C / C ++宏:它从声明点应用到文件末尾或直到重新声明,因此您必须重新声明它
答案 2 :(得分:1)
此语句的行为类似于C预处理器宏,因此它从代码中插入语句的位置开始,直到源文件的末尾,或者使用不同的命令重新声明相同的语句。如果你在函数,for,while或任何其他代码块中声明它是无关紧要的:该声明适用于他的声明直到文件结束或下一个声明
我经常使用此指令来处理Pro * C ++源代码中的游标:
EXEC SQL WHENEVER NOT FOUND DO THROW_SQLERROR("free text"); // If no data found execute THROW_SQLERROR macro.
try
{
EXEC SQL DECLARE c CURSOR FOR
SELECT field
FROM table;
EXEC SQL OPEN c;
while(1)
{
EXEC SQL WHENEVER NOT FOUND DO break; // if no data found execute C break
EXEC SQL FETCH c INTO :iField;
EXEC SQL WHENEVER NOT FOUND DO THROW_SQLERROR("free text"); // If no data found execute C THROW_SQLERROR macro.
...
}
EXEC SQL CLOSE c;
}
catch(...)
{
try { EXEC SQL CLOSE c; } catch(...) { }
throw;
}