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