我有一个表TMP(CodA)和这个FOR循环:
FOR var IN (SELECT * FROM tmp)
LOOP
....
END LOOP
如果在循环体中我做了INSERT INTO TMP将被考虑并且for会继续迭代吗?
答案 0 :(得分:0)
是的,您可以插入到已从中派生游标的表中。读取不会干扰后续写入。
以下是一个例子:
设定:
CREATE TABLE TMP(CODA NUMBER);
INSERT INTO TMP VALUES (10);
INSERT INTO TMP VALUES (20);
COMMIT;
然后运行块:
DECLARE
V_LOOP_COUNTER NUMBER := 0;
BEGIN
FOR VAR IN (SELECT * FROM TMP)
LOOP
V_LOOP_COUNTER := V_LOOP_COUNTER + 1;
DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Loop iteration number: %s for coda-value: %d',TO_CHAR(V_LOOP_COUNTER),TO_CHAR(VAR.CODA)));
INSERT INTO TMP VALUES (100 + VAR.CODA);
END LOOP;
END;
/
编辑循环迭代:
查看DBMS_OUTPUT
,后续的INSERT
不会干扰LOOP
次迭代次数:
Loop iteration number: 1 for coda-value: 10
Loop iteration number: 2 for coda-value: 20
PL/SQL procedure successfully completed.
然后在程序完成后,可以看到INSERT
ed数据:
SELECT * FROM TMP
ORDER BY CODA ASC;
CODA
----------
10
20
110
120