webentwicklung-frage-antwort-db.com.de

Cursor für Schleife in Oracle

Bitte erklären Sie mir, wie Sie den Cursor für die Schleife in Oracle verwenden.

Wenn ich nächsten Code verwende, ist alles in Ordnung.

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

Wenn ich jedoch eine Variable für diese SQL-Anweisung definiere, funktioniert sie nicht.

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

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

Fehler: PLS-00103

9

Um Probleme zu lösen, die mit dem zweiten Ansatz Ihrer Frage zusammenhängen, müssen Sie diese verwenden

cursor-Variable und explizite Art, einen Cursor zu öffnen und Daten abzurufen. Es ist nicht

erlaubt die Verwendung von Cursor-Variablen in der FOR-Schleife:

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;

Finde mehr heraus

11
Nick Krasnov

versuche dies :

cursor v_sql is
select id, name from students;

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

dann muss der Cursor nicht open, fetch oder close sein.

Sie führen diesen SQL-String nirgendwo aus. Mach das einfach

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

Oder Sie können das tun

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

Oder Sie können das tun

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

Sie müssen Refcursor verwenden, wenn Sie die Abfrage zur Laufzeit durchführen. Tatsächlich sind Refcursors Zeiger auf die Abfrage, die nicht mehr Platz für die abgerufenen Zeilen beansprucht. __ Normale Cursors funktionieren dafür nicht.

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