2017-09-09 12 views
0

カーソルをループしながらバルクを使用して3つの変数をフェッチしたい。出来ますか?カーソルが必要differenテーブルからデータを選択した場合(変数が宣言されていると仮定)、クエリの下2つ以上の変数にバルクを集める

DECLARE 
    CURSOR recCurosr 
    IS 
     SELECT t1.name,t2.value1, t2.value2 
     FROM table1 t1, table2 t2 
     WHERE t1.pk = t2.pk; 

BEGIN 
    OPEN recCurosr; 
    LOOP 
     FETCH recCurosr BULK COLLECT INTO var1, var2, var3; 
     BEGIN 
      FORALL i IN 1 .. var1.count SAVE EXCEPTIONS 
       UPDATE table1 
       SET value1= var2, 
       WHERE value1= var3 
       AND pk = var1; 
+1

はい:[ドキュメントを参照](http://docs.oracle.com/database/121/LNPLS/tuning.htm#GUID-6E09E4FC-28C0-43C8-9E7C-A54D6398D1DE__BABJCBGD) –

+0

これは役に立ちました。ありがとうございます – Vimal

+0

'forall'ステートメントは、ループの回りで初めて' recCurosr'によって返されたすべての行を処理します。ループの残りの部分には何がありますか? –

答えて

1

を参照してください。

DECLARE 
    CURSOR c1 IS SELECT 'name1', 1, 2 FROM dual; 

    TYPE abc IS RECORD (-- define a record type record 'abc' 
     name  VARCHAR2 (100), 
     value1 NUMBER, 
     value2 NUMBER 
    ); 
    myAbc  abc; -- declare an object with type 'abc' 

    TYPE abcTab IS TABLE OF abc; -- define a table type 'abcTab' 
    myAbcTab abcTab; -- declare an object with type 'abcTab' 

BEGIN 
    OPEN c1; 
    FETCH c1 BULK COLLECT INTO myAbcTab; 
    FOR i IN myAbcTab.FIRST .. myAbcTab.LAST LOOP 
    dbms_output.put_line(myAbcTab(i).name); 
    END LOOP; 
    CLOSE c1; 
END; 
/

あなただけの単一のテーブルからすべての列が必要な場合は、代わりにmyAbcTab table1%ROWTYPE;を使用することができます

関連する問題