在 oracle pro 中 *c/c++
EXEC SQL WHENEVER SQLERROR DO break;
这个声明实际上是做什么的?这会在所有以下 exec sql 语句中插入 break 语句吗?
如何限制do break的范围?
在 oracle pro 中 *c/c++
EXEC SQL WHENEVER SQLERROR DO break;
这个声明实际上是做什么的?这会在所有以下 exec sql 语句中插入 break 语句吗?
如何限制do break的范围?
从文档中:
休息一下
一个实际的“break”语句被放置在你的程序中。在循环中使用此操作。当满足 WHENEVER 条件时,您的程序将退出它所在的循环。
因此,每当遇到错误时,break
都会发出 a ,这在循环之外没有多大意义。如果要在特定语句后重置行为,请发出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;
}