是否有可能以这种方式修改FOR IN循环?

时间:2017-03-26 18:02:46

标签: sql oracle plsql

我有一个表TMP(CodA)和这个FOR循环:

FOR var IN (SELECT * FROM tmp) 
LOOP
   ....
END LOOP

如果在循环体中我做了INSERT INTO TMP将被考虑并且for会继续迭代吗?

1 个答案:

答案 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
相关问题