PL / SQl嵌套如果循环内部如果循环没有退出

时间:2011-12-21 19:56:21

标签: oracle plsql nested-if

大家好我对PL / SQL有点新意,所以有点困惑。我有一个名为rec的Cursor,在循环时我有两个嵌套的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语句,之后的所有记录。我甚至尝试在EXIT循环中的逻辑之后使用IF语句,但无济于事。我做错了什么?

3 个答案:

答案 0 :(得分:3)

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

如果它没有执行更新,则“执行某些操作的代码”是(a)使用影响流控制的显式命令,例如EXITCONTINUEGOTO,或(b)遇到导致控件切换到某处异常处理程序的错误。

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

答案 1 :(得分:1)

  1. 有可能更新的status_log行被另一个会话锁定。 您可以查询v $ session视图的blocking_session列。

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

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

答案 2 :(得分:0)

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