plsql:Cursor内部的动态SQL

时间:2015-12-28 07:29:12

标签: plsql cursor dynamic-sql

v_upd_cur := 'Select m.name, m.age'|| ' From ' || act_table || ' m Where m.age < 30';

这是游标中的动态SQL select语句。如何在名为cur

的游标中放入select语句

我尝试过类似下面的代码无法正常工作,有人有更好的建议吗?

Cursor cur IS v_upd_cur;

2 个答案:

答案 0 :(得分:2)

您可以使用sys_refcursor尝试此操作。请查看以下示例

DECLARE
    my_cursor   SYS_REFCURSOR;
    v_name      VARCHAR2 (100);
    v_string    VARCHAR2 (1000) := 'SELECT ename
                  FROM   emp';
BEGIN
    OPEN my_cursor FOR v_string;

    LOOP
        FETCH my_cursor INTO v_name;

        DBMS_OUTPUT.put_line (v_name);
        EXIT WHEN my_cursor%NOTFOUND;
    END LOOP;

    CLOSE my_cursor;
END;

答案 1 :(得分:0)

您可以用同样的方式打开静态或动态引用:

declare
    rc sys_refcursor;
begin
    open rc for select * from dual;
end;
declare
    rc sys_refcursor;
begin
    open rc for 'select * from dual';
end;

然后你只需要把它提取到一个合适的记录中。

在 21c 中,这有所简化。假设 employee_rectype 是与 sql_text 中员工的动态游标匹配的记录类型:

for r employee_rectype in values of (
    execute immediate sql_text
)
loop
    dbms_output.put_line(r.firstname || ', ' || r.lastname);
end loop;