【请教】前辈们,关于引用游标的一个小问题

Tsinlei 2013-07-10 10:07:35
今天学到了游标,有道题老是报“ORA-06550 必须声明组件错误。”
刚接触Oracle,还请前辈们不吝赐教啊~

题目:使用引用游标查询EMP表,随着外界传入的字段列表不同,输出不同的查询结果。
要求输入三个不同字段;

我的做法:

declare
type newcur is ref cursor;
mycur newcur;
cmd1 varchar2(10);
cmd2 varchar2(10);
cmd3 varchar2(10);
curRow emp%rowtype;
sql1 varchar(200);
begin
cmd1 :='&字段1';
cmd2 :='&字段2';
cmd3 :='&字段3';
sql1 := 'select ' || cmd1 ||' as c1,' || cmd2 ||' as c2,' || cmd3 ||' as c3 from emp';

open mycur for sql1;
loop
fetch mycur into curRow;
exit when mycur%notfound;
dbms_output.put_line(curRow.c1 ||' '||curRow.c2||' '||curRow.c3);
end loop;
end;


可总提示第19行的c1必须声明,不知道哪里错了,
麻烦帮忙看看错哪里吧,先谢谢了~
...全文
119 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tsinlei 2013-07-11
  • 打赏
  • 举报
回复
感谢两位前辈的热心帮助,问题解决了~ 我也记得以后要close游标了 另外有个疑问,上面我们的c1,c2,c3都是varchar类型,但emp表的许多字段是number或date类型,为什么不会报数据类型不匹配的错误呢
陈字文 2013-07-11
  • 打赏
  • 举报
回复
引用 1 楼 sych888 的回复:
换种方式写一下 declare type newcur is ref cursor; mycur newcur; cmd1 varchar2(10); cmd2 varchar2(10); cmd3 varchar2(10); --curRow emp%rowtype; c1 varchar2(100); c2 varchar2(100); c3 varchar2(100); sql1 varchar(200); begin cmd1 :='&字段1'; cmd2 :='&字段2'; cmd3 :='&字段3'; --sql1 := 'select ' || cmd1 ||' as c1,' || cmd2 ||' as c2,' || cmd3 ||' as c3 from emp'; sql1 := 'select ' || cmd1 ||' ,' || cmd2 ||',' || cmd3 ||' from emp'; dbms_output.put_line( 'sql1='||sql1); open mycur for sql1; loop fetch mycur into c1,c2,c3; dbms_output.put_line(c1 ||' '||c2||' '||c3);exit when mycur%notfound; end loop; close mycur;end; /
Good Job! 动态sql游标,Oracle并不能预知sql的传出值会有几个。 LS用的FETCH XXX INTO C1,C2,C3,等于告诉Oracle上面的动态SQL是有三个传出参数。
sych888 2013-07-10
  • 打赏
  • 举报
回复
换种方式写一下 declare type newcur is ref cursor; mycur newcur; cmd1 varchar2(10); cmd2 varchar2(10); cmd3 varchar2(10); --curRow emp%rowtype; c1 varchar2(100); c2 varchar2(100); c3 varchar2(100); sql1 varchar(200); begin cmd1 :='&字段1'; cmd2 :='&字段2'; cmd3 :='&字段3'; --sql1 := 'select ' || cmd1 ||' as c1,' || cmd2 ||' as c2,' || cmd3 ||' as c3 from emp'; sql1 := 'select ' || cmd1 ||' ,' || cmd2 ||',' || cmd3 ||' from emp'; dbms_output.put_line( 'sql1='||sql1); open mycur for sql1; loop fetch mycur into c1,c2,c3; dbms_output.put_line(c1 ||' '||c2||' '||c3);exit when mycur%notfound; end loop; close mycur;end; /

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧