S'il vous plaît, expliquez-moi comment utiliser le curseur pour boucle dans Oracle.
Si j'utilise le code suivant, tout va bien.
for rec in (select id, name from students) loop
-- do anything
end loop;
Mais si je définis variable pour cette instruction SQL, cela ne fonctionne pas.
v_sql := 'select id, name from students';
for rec in v_sql loop
-- do anything
end loop;
Erreur: PLS-00103
Pour résoudre les problèmes liés à la deuxième approche de votre question, vous devez utiliser
curseur variable et manière explicite d'ouvrir un curseur et d'extraire des données. Ce n'est pas
autorisé à utiliser des variables de curseur dans la boucle FOR
:
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;
essaye ça :
cursor v_sql is
select id, name from students;
for rec in v_sql
loop
-- do anything
end loop;
alors pas besoin de open
, fetch
ou close
le curseur.
Vous n'exécutez cette chaîne SQL nulle part. Faites ceci simplement
v_sql := 'select id, name from students';
open cur for v_sql;
for rec in cur loop
-- do anything
end loop;
Ou tu peux faire ça
cursor cur is select id, name from students;
open cur;
for rec in cur loop
-- do anything
end loop;
Ou tu peux faire ça
for rec in (select id, name from students) loop
-- do anything
end loop
Vous devez utiliser Refcursor si vous effectuez la requête au moment de l'exécution. En réalité, les refcursors sont des pointeurs sur la requête, ils ne prendront pas de place pour les lignes extraites . Les curseurs normaux ne fonctionneront pas.
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;