2009-08-28 6 views
7

Ich schreibe eine einfache Prozedur. Ich versuche, das Auswahlergebnis in der Variablen zu speichern. Ich benutze die Abfrage "SELECT INTO", aber ich kann das nicht tun.So speichern Sie Auswahlergebnis in Variable in Oracle-Prozedur

Beispiel:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

Können Sie uns mit einem einfachen Beispiel und der Nachricht Fehler erhalten Sie? –

+0

Ich kann nur eine Zeile speichern, aber mein Auswahlergebnis enthält viele Zeilen. –

Antwort

11

Sie haben ein paar Optionen. Sie könnten diese Abfrage in einen Cursor drehen:

DECLARE 
    CURSOR v_employeeRecords IS 
      SELECT * FROM Employee WHERE Salary > 10; 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
    FOR v_employeeRecord IN v_employeeRecords LOOP 
      /* Do something with v_employeeRecord */ 
    END LOOP; 
END; 

Oder können Sie eine TABLE Variable erstellen:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
    v_employeeRecords IS TABLE OF employee%ROWTYPE; 
    i BINARY_INTEGER; 
BEGIN 
SELECT * BULK COLLECT INTO v_employeeRecords 
     FROM Employee WHERE Salary > 10; 

i := v_employeeRecords.FIRST; 
WHILE v_employeeRecords.EXISTS(i) LOOP 
    v_employeeRecord := v_employeeRecords(i); 
    /* Do something with v_employeeRecord */ 
    i := v_employeeRecords.NEXT(i); 
END; 
END; 

Ich habe diese Proben in Oracle nicht versucht, so können Sie Compiler-Fehler erhalten ..

+0

Cursor lösen mein Problem. –

+2

Sie müssen "BULK COLLECT IN" verwenden – jva

+0

@jva: Danke für den Fang! –

7

Wenn Ihr SELECT mehr als eine Zeile zurückgibt, können Sie den SELECT INTO Synthax nicht verwenden.

Sie müssen eine Schleife bauen durch die resulte Menge zu navigieren:

Adam gezeigt, wie Sie einen expliziten Cursor verwenden würde und eine Bulk-Schleife sammeln. Ich werde zeigen, wie Sie die einfachste mögliche Schleife erstellen können (impliziter Cursor, benötigt keinen DECLARE-Abschnitt):

+0

Gutes Beispiel, danke –