Come archiviare la selezione risulta in una variabile nella procedura Oracle
-
20-09-2019 - |
Domanda
Scrivo una semplice procedura. Provo a memorizzare il risultato di selezione in variabile. Uso query "seleziona in" ma non posso farlo.
Esempio:
DECLARE
v_employeeRecord employee%ROWTYPE;
BEGIN
SELECT * INTO v_employeeRecord
FROM Employee WHERE Salary > 10;
END;
Soluzione
Hai un paio di opzioni. Potresti trasformare quella query in un cursore:
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;
Oppure puoi creare un TABLE
variabile:
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;
Non ho provato questi campioni in Oracle, quindi potresti ottenere errori del compilatore ...
Altri suggerimenti
Se la selezione restituisce più di una riga, non sarai in grado di utilizzare SELECT IN SYNTHAX.
Dovrai creare un ciclo per navigare attraverso il set di risultati:
Adamo Dimostrato come useresti un cursore esplicito e un ciclo di raccolta in blocco. Mostrerò come puoi creare il ciclo più semplice possibile (cursore implicito, non ha bisogno di una sezione di dichiarazione):
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;