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;
Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top