私はFORループテーブルTMP(CODA)と、これを持っている:このようにFOR INループを変更することはできますか?
FOR var IN (SELECT * FROM tmp)
LOOP
....
END LOOP
ループ本体に、私はINSERT INTO TMPは、それが考慮されて、ために反復していきます作る場合は?
私はFORループテーブルTMP(CODA)と、これを持っている:このようにFOR INループを変更することはできますか?
FOR var IN (SELECT * FROM tmp)
LOOP
....
END LOOP
ループ本体に、私はINSERT INTO TMPは、それが考慮されて、ために反復していきます作る場合は?
はい、カーソルが派生したテーブルに挿入できます。読み込みは後続の書き込みに干渉しません。ここで
は例です:セットアップ: DBMS_OUTPUT
を見てみると、それに続くINSERT
S:ループの反復ため
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;
/
編集:
CREATE TABLE TMP(CODA NUMBER);
INSERT INTO TMP VALUES (10);
INSERT INTO TMP VALUES (20);
COMMIT;
はその後ブロックを実行の番号に干渉しない0回の反復:手続きが完了した後に
Loop iteration number: 1 for coda-value: 10
Loop iteration number: 2 for coda-value: 20
PL/SQL procedure successfully completed.
そして、1はINSERT
編データを見ることができます:
SELECT * FROM TMP
ORDER BY CODA ASC;
CODA
----------
10
20
110
120
forループは2回しか反復しません(最初の行数)? – Diablo3000
Thanks @ Diablo3000。もちろん、フェッチされた行の最初の数だけ反復処理されます。ループ内のインサートは反復回数を変更しません。私はこれを実証するために私の答えを更新します。 – alexgibbs
@ Diablo3000ループ反復を追跡する答えを更新しました。これはループを明確にするのに役立ちますか?ありがとう – alexgibbs
なぜそれを自分を試してみませんか? – GurV
私はこの時点ではテストできません – Diablo3000
ここでテストすることができます - http://rextester.com/l/oracle_online_compiler – GurV