2013-08-16 7 views
7

Proszę, wyjaśnij mi, jak używać kursora do pętli w Oracle.Kursor pętli w Oracle

Jeśli użyję kolejnego kodu, wszystko jest w porządku.

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

Ale jeśli zdefiniuję zmienną dla tego wyrażenia sql, to nie działa.

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

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

Błąd: PLS-00103

Odpowiedz

10

Aby rozwiązać problemy związane z drugim podejściu w swoim pytaniu trzeba użyć

kursora zmiennej i wyraźny sposób otwierania kursor i pobierania danych. To nie jest

wolno używać zmiennych kursora w FOR pętli:

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

Najbardziej właściwą odpowiedź na teraz. Myślałem, że wszystko będzie łatwiejsze. Dzięki za twoją decyzję. –

5

spróbuj tego:

cursor v_sql is 
select id, name from students; 

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

wtedy nie trzeba open, fetch lub close kursora .

+0

Myślę, że ten kod zadziała, jeśli będę znał kod SQL na etapie definicji, ale generuje on na etapie realizacji. –

+0

można zdefiniować parametry w definicji kursora, ale tylko dla klauzuli where. Jeśli chcesz ustawić tabelę dynamicznie, najprawdopodobniej jest to "OPEN c FOR string". –

0

Musisz użyć Refcursor, jeśli tworzysz zapytanie w czasie wykonywania. W rzeczywistości refkursory są wskaźnikami do zapytania, które nie zajmą żadnej przestrzeni dla pobranych wierszy. Kursory zwykłe nie będą dla niego działać.

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

Nie naciśniesz tego ciągu w dowolnym miejscu. Wystarczy zrobić to

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

Albo można to zrobić

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

Albo można to zrobić

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