PL/SQL-Cursor: 用 FOR 和 IN 迭代
PL/SQL-Cursor: iterate with FOR and IN
我尝试遍历游标。它的语句是动态创建的。
如果我通过 LOOP 和 FETCH 这样做,一切都很好。
如果我尝试通过 FOR 和 IN 来完成语法错误('CUR' 没有过程或未定义)
如何使用 FOR 和 IN 实现?
DECLARE
FUNCTION foo (pat VARCHAR) RETURN NUMBER IS
sqlcmd VARCHAR (100);
TYPE t_refcur IS REF CURSOR;
cur t_refcur;
str VARCHAR (200);
BEGIN
sqlcmd := 'SELECT name FROM my_tab WHERE name LIKE :1';
-- 1st loop ok
OPEN cur FOR sqlcmd USING pat;
LOOP
FETCH cur INTO str;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line('C1 '|| str);
END LOOP;
CLOSE cur;
-- 2nd loop with syntax error (no procedure or CUR not known)
OPEN cur FOR sqlcmd USING pat;
FOR str IN cur LOOP
dbms_output.put_line('C2 '|| str);
END LOOP;
CLOSE cur;
RETURN 1;
END foo;
BEGIN
dbms_output.put_line (foo ('A%'));
END;
不幸的是,for in cycle with ref cursor 不可用,因为 for in cycle 需要在编译时定义的列列表。例如
begin
for i in (select dummy, sysdate dt from dual) loop
dbms_output.put_line(i.dummy || ': ' || i.dt);
end loop;
end;
/
我尝试遍历游标。它的语句是动态创建的。
如果我通过 LOOP 和 FETCH 这样做,一切都很好。 如果我尝试通过 FOR 和 IN 来完成语法错误('CUR' 没有过程或未定义)
如何使用 FOR 和 IN 实现?
DECLARE
FUNCTION foo (pat VARCHAR) RETURN NUMBER IS
sqlcmd VARCHAR (100);
TYPE t_refcur IS REF CURSOR;
cur t_refcur;
str VARCHAR (200);
BEGIN
sqlcmd := 'SELECT name FROM my_tab WHERE name LIKE :1';
-- 1st loop ok
OPEN cur FOR sqlcmd USING pat;
LOOP
FETCH cur INTO str;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line('C1 '|| str);
END LOOP;
CLOSE cur;
-- 2nd loop with syntax error (no procedure or CUR not known)
OPEN cur FOR sqlcmd USING pat;
FOR str IN cur LOOP
dbms_output.put_line('C2 '|| str);
END LOOP;
CLOSE cur;
RETURN 1;
END foo;
BEGIN
dbms_output.put_line (foo ('A%'));
END;
不幸的是,for in cycle with ref cursor 不可用,因为 for in cycle 需要在编译时定义的列列表。例如
begin
for i in (select dummy, sysdate dt from dual) loop
dbms_output.put_line(i.dummy || ': ' || i.dt);
end loop;
end;
/