2013-08-16 16 views
7

Per favore, spiegami come usare il cursore per il loop in oracle.Cursore per loop in Oracle

Se utilizzo il codice successivo, tutto va bene.

for rec in (select id, name from students) loop 
    -- do anything 
end loop; 

Ma se definisco la variabile per questa istruzione sql, non funziona.

v_sql := 'select id, name from students'; 

for rec in v_sql loop 
    -- do anything 
end loop; 

Errore: PLS-00103

risposta

10

per affrontare i problemi connessi con il secondo approccio nella sua domanda è necessario utilizzare

variabile cursore e il modo esplicito di aprire un cursore e il recupero dei dati. Non è

permesso di utilizzare le variabili del cursore nel FOR ciclo:

declare 
    l_sql varchar2(123);  -- variable that contains a query 
    l_c sys_refcursor;  -- cursor variable(weak cursor). 
    l_res your_table%rowtype; -- variable containing fetching data 
begin 
    l_sql := 'select * from your_table'; 

    -- Open the cursor and fetching data explicitly 
    -- in the LOOP. 

    open l_c for l_sql; 

    loop 
    fetch l_c into l_res; 
    exit when l_c%notfound; -- Exit the loop if there is nothing to fetch. 

    -- process fetched data 
    end loop; 

    close l_c; -- close the cursor 
end; 

Find out more

+1

La risposta più appropriata per ora. Ho pensato, tutto sarà più facile. Grazie per la tua decisione. –

5

provare questo:

cursor v_sql is 
select id, name from students; 

for rec in v_sql 
loop 
    -- do anything 
end loop; 

quindi non c'è bisogno di open, fetch o close il cursore .

+0

Penso che questo codice funzionerà se saprò il codice sql in fase di definizione, ma si genererà in fase di esecuzione. –

+0

è possibile definire i parametri nella definizione del cursore, ma solo per la clausola where. Se è necessario impostare la tabella in modo dinamico, la 'OPEN c FOR string' è probabilmente la strada da percorrere. –

0

È necessario utilizzare Refcursor se si sta effettuando la query in fase di esecuzione. In realtà i refcursor sono puntatori alla query che non occuperanno spazio per le righe recuperate. I cursori normali non funzioneranno per questo.

declare 
v_sql varchar2(200); 
rec sys_refcursor; 
BEGIN 
v_sql := 'select id, name from students'; 

open rec for v_sql 
loop 
fetch 
exit when.... 
-- do anything 
end loop; 
2

Non stai eseguendo quella stringa SQL ovunque. Basta fare questo

v_sql := 'select id, name from students'; 
open cur for v_sql; 
for rec in cur loop 
    -- do anything 
end loop; 

Oppure si può fare questo

cursor cur is select id, name from students; 
open cur; 
for rec in cur loop 
     -- do anything 
end loop; 

Oppure si può fare questo

for rec in (select id, name from students) loop 
    -- do anything 
end loop