如何在pro * c / c ++中限制EXEC SQL WHENEVER SQLERROR DO中断的范围

时间:2014-04-02 09:47:04

标签: oracle oracle-pro-c

在oracle pro * c / c ++

EXEC SQL WHENEVER SQLERROR DO break;

这句话实际上做了什么?这会在以下所有exec sql语句中插入break语句吗?

如何限制do break的范围?

3 个答案:

答案 0 :(得分:2)

From the documentation

  

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;
        }