使用'open cursor'作为'execute immediate'

时间:2017-06-28 08:48:53

标签: sql oracle plsql oracle-sqldeveloper

我正在尝试使用open cursor作为execute immediate的替代,因为我的SQL语句可以返回多个记录。

 open cur1 for rule_sql;
   loop        
    dbms_output.put_line(cur1.rule_id);
   end loop;
 close cur1;

它抛出错误说:“PLS-00487:对变量'CUR1'的引用无效”

有没有人有类似的问题?非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:2)

光标只是指向结果集的指针。要引用其内容,您需要将fetch变为变量。请注意,变量必须是与查询投影匹配的记录类型。如果您使用动态SQL来实现一组流畅的列,这可能很难。

无论如何,这样的事情:

declare
    cur1 sys_refcursor;
   Type cur_rec is record (
        rule_id number,
        rule_desc varchar2(32));

    row1 cur_rec;
    ....
Begin
     ...
     open cur1 for stmt;
     for row1 in cur1 loop
           Dbms_output.put_line(row1.rule_id);
    End loop;
    ....
End;
  

"如果我不知道结果中的列类型,那么我就无法创建一个变量来捕获游标值。"

如果您在编译时不知道查询的投影,那么生活会更加复杂。您不能再使用Native Dynamic SQL了,您需要使用完整的DBMS_SQL。

在11g中,Oracle推出了所谓的Method 4 Dynamic SQL。这允许我们以更多代码为代价处理变量投影。 Adrian Billington在他的Oracle-developer.net网站上写了一篇很好的介绍。 Check it out

答案 1 :(得分:1)

您错过了fetch声明 - 请参阅Example 7.4 in docs

open cur1 for rule_sql;
loop        
  fetch cur1 into my_row_variable;
  exit when cur1%notfound;
  dbms_output.put_line(cur1.rule_id);
end loop;
close cur1;