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