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;
È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top