web-dev-qa-db-fra.com

Curseur pour la boucle dans Oracle

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

9
Anton Barycheuski

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;

En savoir plus

11
Nick Krasnov

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.

7

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
2
Nikhil

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;
0
Harshit