2017-09-09 3 views
0

Ich möchte drei Variablen mit Bulk sammeln während der Schleife durch einen Cursor abrufen. Ist es möglich? Bitte beachten Sie unter Abfrage (nehmen Variablen deklariert werden)Bulk Collect in zwei oder mehr Variablen

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

Ja: [siehe Dokumentation] (http://docs.oracle.com/database/121/LNPLS/tuning.htm#GUID-6E09E4FC-28C0-43C8-9E7C-A54D6398D1DE__BABJCBGD) –

+0

Das war hilfreich. Danke – Vimal

+0

Die Forall-Anweisung verarbeitet alle Zeilen, die von 'recCurosr' zum ersten Mal in der Schleife zurückgegeben werden. Was gibt es für den Rest der Schleife zu tun? –

Antwort

1

Wenn Sie den Cursor Daten aus differen Tabellen auswählt, die Sie brauchen:

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; 
/

Wenn Sie nur alle Spalten aus einer einzigen Tabelle müssen Sie myAbcTab table1%ROWTYPE; verwenden können, statt

Verwandte Themen