Ref Cursor

cd_yuxueming 2009-08-19 09:36:38
create or replace procedure test
IS
Type MyRefCur IS Ref Cursor;
vRefCur MyRefCur;
vtemp vRefCur%ROWTYPE;
Begin
OPEN vRefCur FOR Select * from cmcs_res_bts_area;
Close vRefCur;
end test;


Error: PLS-00320: 此表达式的类型说明不完整或格式不正确
Line: 5
Text: vtemp vRefCur%ROWTYPE;

Error: PL/SQL: Item ignored
Line: 5
Text: vtemp vRefCur%ROWTYPE;

Error: Hint: Variable 'vtemp' is declared but never used in 'test'
Line: 5
Text: vtemp vRefCur%ROWTYPE;
...全文
99 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cd_yuxueming 2009-08-19
  • 打赏
  • 举报
回复
不定义为行数据类型就可以!
create or replace procedure test
IS
Type MyRefCur IS Ref Cursor;
vRefCur MyRefCur;
v_id NUMBER;
--vtemp vRefCur%ROWTYPE;
--vtemp varchar2(4000);
Begin
OPEN vRefCur FOR Select area_id from cmcs_res_bts_area;
Loop
FETCH vRefCur INTO v_id;
EXIT WHEN vRefCur%NOTFOUND;
DBMS_OUTPUT.put_line(v_id);
end LOOP;
Close vRefCur;
end test;

我的目地就是定义为%ROWTYPE
cd_yuxueming 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fxianxian 的回复:]
create or replace procedure test
IS
Type MyRefCur  IS  Ref  Cursor;
  vRefCur MyRefCur;
Begin
OPEN vRefCur FOR Select * from cmcs_res_bts_area;
  Close  vRefCur;
end test;

这样就可以了
[/Quote]
这样编译是不会报错,
如果不定义vtemp vRefCur%ROWTYPE;我怎么来循环使用它呢?
fxianxian 2009-08-19
  • 打赏
  • 举报
回复
create or replace procedure test
IS
Type MyRefCur IS Ref Cursor;
vRefCur MyRefCur;
Begin
OPEN vRefCur FOR Select * from cmcs_res_bts_area;
Close vRefCur;
end test;

这样就可以了
cd_yuxueming 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cd_yuxueming 的回复:]
我用了个最笨的办法:把每个查询出的字段都定义上。就可以直接使用了。
[/Quote]
fxianxian 的 也是一种解决办法
type type_refcursor is table of cmcs_res_bts_area%rowtype;
cd_yuxueming 2009-08-19
  • 打赏
  • 举报
回复
我用了个最笨的办法:把每个查询出的字段都定义上。就可以直接使用了。
inthirties 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cd_yuxueming 的回复:]
不定义为行数据类型就可以!
create or replace procedure test
IS
Type MyRefCur  IS  Ref  Cursor;
  vRefCur MyRefCur;
  v_id NUMBER;
  --vtemp  vRefCur%ROWTYPE;
  --vtemp varchar2(4000);
Begin
OPEN vRefCur FOR Select area_id from cmcs_res_bts_area;
Loop
    FETCH vRefCur INTO v_id;
    EXIT WHEN vRefCur%NOTFOUND;
    DBMS_OUTPUT.put_line(v_id);
end LOOP;
  Close  vRefCur;
end test;

我的目地就是定义为%ROWTYPE
[/Quote]

动态游标是不能做到真正的结果集动态的

如果需要做到返回动态结果集,只能用多维数组来实现了。

动态数组的方式可以参考
http://blog.csdn.net/inthirties/archive/2009/08/02/4400905.aspx
或者
http://www.inthirties.com/?p=840
fxianxian 2009-08-19
  • 打赏
  • 举报
回复
定义一个type类型
type type_refcursor is table of cmcs_res_bts_area%rowtype;
v_refcursor type_refcursor;
在fetch的时候,就可以直接用这个type变量
举个列子:
create or replace procedure test 
IS
Type MyRefCur IS Ref Cursor;
vRefCur MyRefCur;
type type_refcursor is table of cmcs_res_bts_area%rowtype;
v_refcursor type_refcursor;
Begin
OPEN vRefCur FOR Select * from cmcs_res_bts_area;
fetch vRefCur bulk collect into v_refcursor;
Close vRefCur;
for i in 1..v_refcursor.count loop
DBMS_OUTPUT.put_line(v_refcursor(i).area_id);
end loop;
end test;


仅供参考!

17,377

社区成员

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

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