大家好我对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
语句,但无济于事。我做错了什么?
答案 0 :(得分:3)
IF不是循环。这可能实际上是一个重要的点,因为你说你已经尝试使用EXIT
,并且该语句的目的是退出立即封闭的循环。在这种情况下,这意味着光标上的循环(除非你的“代码做某事”包括其他循环)。所以你放入的任何EXIT
都会导致整个循环终止。
如果它没有执行更新,则“执行某些操作的代码”是(a)使用影响流控制的显式命令,例如EXIT
,CONTINUE
或GOTO
,或(b)遇到导致控件切换到某处异常处理程序的错误。
如果执行正在更新但是失败,那么你应该会看到一个错误 - 除非在某个地方有一个隐藏它的异常处理程序。
答案 1 :(得分:1)
有可能更新的status_log行被另一个会话锁定。 您可以查询v $ session视图的blocking_session列。
“做某事的代码”正在做点什么。
file_processed
,但锁定了列status
的行。我没有测试过,但这可能是一个问题。答案 2 :(得分:0)
检查您的CURSOR
定义是否包含或排除表status_log
......这可能是问题所在。