【问题标题】:PL/SQl nested If loops inner if loop not exitingPL/SQl 嵌套的 If 循环内部 if 循环不退出
【发布时间】:2011-12-21 19:56:20
【问题描述】:

大家好,我对 PL/SQL 有点陌生,所以有点困惑。我有一个名为 rec 的游标,在遍历它时我有两个嵌套的 IF 语句。

CURSOR Cur IS
    SELECT Mil.Id,
           Mil.Record_Num,
           Mil.Status,
           Mil.file_processed,
           Mil.Updated_By
      FROM status_log mil
     WHERE Mil.file_processed != 'Processed'
     For Update of Mil.file_processed;

 FOR Rec IN Cur LOOP

                IF (Rec.status = 'Ready' OR Rec.status = 'Go') THEN
                     IF Length(Rec.Zip) = 5 AND
               (Substr(Rec.Zip, 1, 3) = '303' OR
                Substr(Rec.Zip, 1, 3) = '304' ) THEN 

                        l_state:= 'ATL';                               
                    END IF;

          UPDATE status_log mil
             SET file_processed = 'Processed'
           WHERE current of cur        

        END IF;

COMMIT;
          END LOOP;

现在,只要光标有一条记录满足第二条IF(即 Zip 长度为 5,代码以 303 或 304 开头),它就不会再针对该记录和之后的所有记录命中 update 语句.我什至尝试在IF 循环中的逻辑之后使用EXIT 语句,但无济于事。我做错了什么?

【问题讨论】:

  • 请张贴光标和“做某事的代码”:)
  • 您是否有可能抛出错误并静默退出? (即你的程序有exception when others then null;
  • 您好,代码可以做一些事情,我只是将变量设置为特定值。该代码不负责任,因为我将其注释掉并尝试使用空白块运行它,但同样的问题。编辑代码有点检查更新。
  • @Allan 我不会默默地扔掉和退出。 exception when others 块中唯一的内容是通知该块已被命中但未命中异常。
  • @Eosphorus 我已经更新了我的答案。

标签: oracle plsql nested-if


【解决方案1】:

IF 不是循环。这实际上可能很重要,因为您说您已经尝试使用EXIT,并且该语句的目的是退出立即封闭的循环。在这种情况下,这意味着光标上的循环(除非您的“做某事的代码”可能包括其他循环)。因此,您输入的任何EXIT 都会导致整个循环终止。

如果它不执行更新,那么“做某事的代码”是(a)使用影响流控制的显式命令,例如EXITCONTINUEGOTO,或 (b) 遇到导致控制切换到某个异常处理程序的错误。

如果执行正在更新但失败,那么您应该会看到一个错误 - 除非再次在某处有一个异常处理程序对您隐藏它。

【讨论】:

  • 所做的只是为变量设置一个值。我尝试通过注释掉该部分来使用空白循环,但没有运气:(
【解决方案2】:
  1. 要更新的 status_log 行可能被另一个会话锁定。 可以查询v$session视图的blocking_session列。

  2. “做某事的代码”正在做某事。

  3. 您更新了file_processed 列,但锁定了status 列的行。我没有测试过,但这可能是个问题。

【讨论】:

  • 其实很抱歉,这是我的错字,我锁定的是 file_processed 而不是状态。编辑了帖子。我想我只是在某个地方遇到了一个异常,而我们用来记录错误的包不起作用。所以我正在写一些 dbms 输出行来看看发生了什么
【解决方案3】:

检查您的CURSOR 定义是否包含或排除表status_log...这可能是问题所在。

【讨论】:

  • 不应该是原因 - Oracle 保证游标一旦打开就会“看到”一组一致的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2019-06-27
  • 2019-10-01
  • 2016-05-03
相关资源
最近更新 更多