0

大家好,我对 PL/SQL 有点陌生,所以有点困惑。我有一个 Cursor 调用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不再针对该记录和之后的所有记录命中该语句。我什至尝试EXIT在循环中的逻辑之后使用该语句,IF但无济于事。我究竟做错了什么?

4

3 回答 3

3

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

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

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

于 2011-12-21T21:44:43.197 回答
1
  1. 要更新的 status_log 行可能被另一个会话锁定。您可以查询 v$session 视图的 blocking_session 列。

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

  3. 您更新了列file_processed,但锁定了该列的行status。我没有测试过,但这可能是个问题。
于 2011-12-21T20:25:29.030 回答
0

检查您的CURSOR定义是否包括或不包括该表status_log......这可能是问题所在。

于 2011-12-21T20:01:20.767 回答