In oracle pro *c/c++
EXEC SQL WHENEVER SQLERROR DO break;
这句话到底是做什么的?这会在以下所有 exec sql 语句中插入中断语句?
如何限制休息的范围?
从文档中:
做休息
一个实际的"break"语句放置在您的程序中。在循环中使用此操作。当满足 WHENEVER 条件时,程序将退出它所在的循环。
因此,每当遇到错误时,都会发出break
,这在循环之外没有太大意义。如果要在特定语句之后重置行为,请发出EXEC SQL WHENEVER SQLERROR CONTINUE;
以重置为默认错误处理行为:
继续
如果可能,程序将继续使用下一条语句运行。这是默认操作,等效于不使用 WHENEVER 指令。您可以使用它来关闭条件检查。
实际上,您可以将语句夹在两个WHENEVER
指令之间,使其仅适用于该语句。
该语句的工作方式类似于 C/C++ 宏:它从声明点一直应用到文件末尾或直到重新声明,因此您必须重新声明它
此语句的作用类似于 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;
}