2017-03-26 9 views
0

私はFORループテーブルTMP(CODA)と、これを持っている:このようにFOR INループを変更することはできますか?

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

ループ本体に、私はINSERT INTO TMPは、それが考慮されて、ために反復していきます作る場合は?

+0

なぜそれを自分を試してみませんか? – GurV

+0

私はこの時点ではテストできません – Diablo3000

+2

ここでテストすることができます - http://rextester.com/l/oracle_online_compiler – GurV

答えて

0

はい、カーソルが派生したテーブルに挿入できます。読み込みは後続の書き込みに干渉しません。ここで

は例です:

セットアップ: 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 
+0

forループは2回しか反復しません(最初の行数)? – Diablo3000

+0

Thanks @ Diablo3000。もちろん、フェッチされた行の最初の数だけ反復処理されます。ループ内のインサートは反復回数を変更しません。私はこれを実証するために私の答えを更新します。 – alexgibbs

+0

@ Diablo3000ループ反復を追跡する答えを更新しました。これはループを明確にするのに役立ちますか?ありがとう – alexgibbs

関連する問題