用于在pro*C中封装PL/SQL块的循环

用于在pro*C中封装PL/SQL块的循环,c,for-loop,plsql,proc,oracle-pro-c,C,For Loop,Plsql,Proc,Oracle Pro C,我见过很多pro*C程序,使用for循环“只执行一次”set a语句。 比如说, for(i = 0; i < 1; i++) { EXEC SQL EXECUTE DECLARE /* some declarations here */ BEGIN /* some PL/SQL code here */ END-EXEC; } (i=0;i

我见过很多pro*C程序,使用for循环“只执行一次”set a语句。 比如说,

for(i = 0; i < 1; i++)
{
    EXEC SQL EXECUTE
    DECLARE

        /* some declarations here */

    BEGIN

        /* some PL/SQL code here  */

    END-EXEC;
}
(i=0;i<1;i++)的

{
EXEC SQL EXECUTE
声明
/*这里有一些声明*/
开始
/*这里有一些PL/SQL代码*/
末端执行器;
}

为什么有必要使用for循环?

只是一个猜测:在使用或
时,使用这样的循环可能会以某种方式简化错误处理

考虑以下代码片段:

for(i = 0; i < 1; i++)
{
    EXEC SQL WHENEVER SQLERROR DO BREAK; 
    EXEC SQL UPDATE emp SET sal = sal * 10; 
}
printf("%d",i);

使用这种循环的常见场景之一是,当数据在一个数组中可用时,该数组将在程序的其他地方使用,但在某些部分中,您只需要处理该数组的第一条记录

这个循环有助于挑选出这类数组的第一条记录


但是,当您需要挑出数组的第一条记录时,请确保在抓取光标中使用“order by”,以便您可以控制第一条记录的内容并相应地对其执行所需的操作。

可能是cargo cult编程。通常在使用(0)
时,
do{/*something*/},主要是在宏中强制用户附加
。@Coconop实际上不是强制添加
。这是为了确保从控件结构体内部使用多语句宏时,其行为符合预期。例如:
if thisOrThat doSomething()。如果
soSomething
是一个多语句宏,要按预期的方式运行,必须将它包装在
do{…}while(0)
块中。可能OP建议的代码片段也有类似的用途(额外的缺点是需要局部变量)。但若并没有上下文,就很难判断。@SylvainLeroux感谢您的澄清:)
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;)
{
    EXEC SQL FETCH...
}
EXEC SQL CLOSE my_cursor;