【问题标题】:for loop enclosing PL/SQL blocks in pro*C在 pro*C 中包含 PL/SQL 块的 for 循环
【发布时间】:2023-03-15 06:37:01
【问题描述】:

我见过许多 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;
}

为什么需要这个 for 循环?

【问题讨论】:

  • 可能是货物崇拜编程。
  • 通常使用do{ /*something*/ }while(0),主要在宏中强制用户在宏调用后附加;
  • @Cocoop 并不是真的要强制添加;。这是为了确保多语句宏在从控制结构体内部使用时按预期运行。例如:if thisOrThat doSomething();。如果soSomething 是一个多语句宏,要按预期运行,它必须包装在do { ... } while(0) 块中。 也许 OP 建议的代码片段具有类似的目的(具有需要局部变量的额外缺点)。没有一些上下文,虽然很难说。
  • @SylvainLeroux 谢谢你的澄清:)

标签: c for-loop plsql proc oracle-pro-c


【解决方案1】:

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

考虑以下代码片段:

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

如果我没记错的话(现在手头没有 pro*C),如果 SQL 查询完成且没有错误,这将打印 1。但否则为 0,因为我们在递增 i 之前 break


在某种程度上,有一个常见的习惯用法是使用无限 for 循环和 WHENEVER DO BREAK 语句来获取结果:

EXEC SQL WHENEVER NOT FOUND DO break;
for (;;)
{
    EXEC SQL FETCH...
}
EXEC SQL CLOSE my_cursor; 

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-30
      • 1970-01-01
      • 2013-07-21
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 2020-12-04
      相关资源
      最近更新 更多