我正在尝试使用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'的引用无效”
有没有人有类似的问题?非常感谢任何帮助:)
答案 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;