Comment stocker la sélection entraîner une variable dans la procédure Oracle
-
20-09-2019 - |
Question
J'écris une procédure simple. J'essaye de stocker la sélection du résultat par une variable. J'utilise "Sélectionner dans" Query mais je ne peux pas faire cela.
Exemple:
DECLARE
v_employeeRecord employee%ROWTYPE;
BEGIN
SELECT * INTO v_employeeRecord
FROM Employee WHERE Salary > 10;
END;
La solution
Vous avez plusieurs options. Vous pouvez transformer cette requête en curseur:
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;
Ou, vous pouvez créer un 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;
Je n'ai pas essayé ces échantillons dans Oracle, vous pouvez donc obtenir des erreurs de compilateur ...
Autres conseils
Si votre sélection renvoie plus d'une ligne, vous ne pourrez pas utiliser le Select dans Synthax.
Vous devrez construire une boucle pour naviguer dans l'ensemble des résultats:
Adam démontré comment vous utiliseriez un curseur explicite et une boucle de collecte en vrac. Je vais montrer comment vous pouvez construire la boucle la plus simple possible (curseur implicite, n'a pas besoin d'une section de déclaration):
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;