So speichern Sie die Auswahl zu einer Variablen in der Oracle -Prozedur
-
20-09-2019 - |
Frage
Ich schreibe eine einfache Prozedur. Ich versuche, die Auswahl zu variabler zu speichern. Ich benutze "SELECT in" Abfrage, kann das aber nicht tun.
Beispiel:
DECLARE
v_employeeRecord employee%ROWTYPE;
BEGIN
SELECT * INTO v_employeeRecord
FROM Employee WHERE Salary > 10;
END;
Lösung
Sie haben ein paar Optionen. Sie könnten diese Abfrage in einen Cursor verwandeln:
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 Sie können a erstellen TABLE
Variable:
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 Muster nicht in Oracle ausprobiert, also erhalten Sie möglicherweise Compiler -Fehler ...
Andere Tipps
Wenn Ihre Auswahl mehr als eine Zeile zurückgibt, können Sie die Auswahl in Synthax nicht verwenden.
Sie müssen eine Schleife erstellen, um durch den resultierenden Satz zu navigieren:
Adam Zeigen Sie, wie Sie einen expliziten Cursor und eine Schüttung ansammeln würden. Ich werde zeigen, wie Sie die einfachste Schleife erstellen können (implizite Cursor, benötigt keinen Deklar -Abschnitt):
BEGIN
FOR c_emp IN (SELECT *
FROM Employee
WHERE Salary > 10) LOOP
/* do something with each row, for example:*/
UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id;
END LOOP;
END;