2009-08-28 16 views
7

Scrivo una semplice procedura. Cerco di memorizzare il risultato della selezione in variabile. Io uso la query "SELECT INTO" ma non posso farlo.Come memorizzare il risultato della selezione nella variabile nella procedura Oracle

Esempio:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

Ci può fornire con un semplice esempio e il messaggio di errore che si ottiene? –

+0

Posso memorizzare solo una riga, ma il mio risultato di selezione contiene un sacco di righe. –

risposta

11

Hai un paio di opzioni. Si potrebbe trasformare la 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; 

In alternativa, è possibile creare una variabile TABLE:

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, in modo è possibile ottenere gli errori del compilatore ..

+0

Il cursore risolve il mio problema. –

+2

Devi usare "BULK COLLECT INTO" – jva

+0

@jva: Grazie per la cattura! –

7

SE l'SELECT restituisce più di una riga, non sarà possibile utilizzare la sintassi SELECT INTO.

Avrete bisogno di costruire un ciclo per navigare attraverso il set resulte:

Adam dimostrato come si usa un cursore esplicito e una massa raccogliere ciclo. Vi mostrerò come si può costruire il circuito 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; 
+0

Buon esempio, grazie –