测试语句调用存储过程返回的游标报结果集类型返回不匹配?

hustsay23 2009-08-19 05:24:04
我写了一个存储过程P_1(IDGroup => v_IDGroup,csr_1 => v_csr_1) 返回一个游标 该游标是 open csr_1 for select * from Temp_LIST1;(那个表Temp_LIST1是一个临时表)

我又写了一个存储过程P_2(IDGroup2 => v_IDGroup2,csr_2 => v_csr_2) 这个存储过程调用了P_1 将P_1返回的游标给了v_csr_2

然后我给P_2写测试语句 声明了一个变量 v_row Temp_LIST1%rowtype; v_csr_test sys_refcursor;
结果测试的时候调用P_2
在fetch v_csr_test into v_row; 这句说结果集变量或查询返回的类型不匹配
可是我在那两个存储过程里面跟踪写语句 都是Temp_LIST1%rowtype 都可以取的出行啊 参数都给的 in out
怎么在测试语句就不行了?是不是因为多次嵌套调用游标就会有问题???


...全文
493 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hustsay23 2009-08-20
  • 打赏
  • 举报
回复

create or replace procedure P_Func_GetIDList
(
IDFlag in out varchar2 --ID类型:HEAD,COLUMN
,TableHead in out varchar2 --表头
,varType in out varchar2 --类型
,csr_list in out sys_refcursor --返回游标集合
)
is
IDGroup varchar2(2000);
--v_row temp_headlist%rowtype;
begin

if (IDFlag='HEAD') then
goto lbl_HEAD;
end if;
if (IDFlag='COLUMN') then
goto lbl_COLUMN;
end if;

return;

<<lbl_HEAD>>
select ID_Group into IDGroup from TBL_Config_PageHeadList where Table_Head=TableHead and OBJ_Type=varType;
p_global_headlist(head_id_group => IDGroup,
csr_headlist => csr_list);
/*
loop
begin
fetch csr_list into v_row;
exit when csr_list%notfound;

dbms_output.put_line(v_row.HEAD_NAME);
dbms_output.put_line(v_row.HEAD_ALIAS_NAME);

end;
end loop;
*/
return;


<<lbl_COLUMN>>
select ID_Group into IDGroup from TBL_Config_PageColumnList where Table_Head=TableHead and OBJ_Type=varType;

p_global_columnlist(column_id_group => IDGroup,
csr_idlist => csr_list);
return;

end P_Func_GetIDList;

hustsay23 2009-08-20
  • 打赏
  • 举报
回复

create or replace procedure P_Global_HeadList
(
Head_ID_Group in out varchar2, --指标集
csr_HeadList in out sys_refcursor --返回结果集
)
is
StartIndex NUMBER;
EndIndex NUMBER;
IDValue NUMBER;
begin
if (Head_ID_Group is null) then
return;
end if;

StartIndex :=1;
EndIndex :=0;

if(substr(Head_ID_Group,-1,1) <> ',') then
Head_ID_Group := Head_ID_Group || ',';
end if;

EndIndex := INSTR(Head_ID_Group,',');
commit;
while(EndIndex >0) LOOP
begin
IDValue := to_number(substr(Head_ID_Group,StartIndex,EndIndex-StartIndex));

execute immediate 'Insert into Temp_HEADLIST(HEAD_ID,TABLE_HEAD,HEAD_NAME,HEAD_ALIAS_NAME) select HEAD_ID,TABLE_HEAD,HEAD_NAME,HEAD_ALIAS_NAME from TBL_Config_HeadList where HEAD_ID=' || IDValue;

StartIndex := EndIndex + 1;
EndIndex := INSTR(Head_ID_Group,',',StartIndex+1);
end;
end loop;

open csr_HeadList for select * from Temp_HEADLIST;

end P_Global_HeadList;
hustsay23 2009-08-20
  • 打赏
  • 举报
回复
按照你上面的方法试了不行 还是贴代码吧
majy 2009-08-20
  • 打赏
  • 举报
回复
你最后展示结果的时候,定义有点问题:
v_csr_test sys_refcursor;

看我上面的例子:

TYPE emp_cur_type IS REF CURSOR RETURN emp%ROWTYPE;

这样,打印出来就没有问题,你可以在你的scott下试运行一下
hustsay23 2009-08-20
  • 打赏
  • 举报
回复
确定不是方法的问题 我翻以前的帖子也有人问游标调用的深度
我和他都用的ORACLE 10G

我在P_2 存储过程里面循环游标结果就没问题 可以显示出来
但是在最外的测试语句执行就报那个错误 那应该是传递问题吧?
难道v_csr_test不是和v_csr_2一样都是指向那个游标结果集的吗?
inthirties 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 hustsay23 的回复:]
我写了一个存储过程P_1(IDGroup => v_IDGroup,csr_1 => v_csr_1) 返回一个游标 该游标是 open csr_1 for select * from Temp_LIST1;(那个表Temp_LIST1是一个临时表)

我又写了一个存储过程P_2(IDGroup2 => v_IDGroup2,csr_2 => v_csr_2) 这个存储过程调用了P_1 将P_1返回的游标给了v_csr_2

然后我给P_2写测试语句 声明了一个变量 v_row Temp_LIST1%rowtype; v_csr_test sys_refcursor;
结果测试的时候调用P_2
在fetch v_csr_test into v_row; 这句说结果集变量或查询返回的类型不匹配
可是我在那两个存储过程里面跟踪写语句 都是Temp_LIST1%rowtype 都可以取的出行啊  参数都给的 in out
怎么在测试语句就不行了?是不是因为多次嵌套调用游标就会有问题???



[/Quote]

把你的方法贴出来看看,也许是方法里有什么问题。
majy 2009-08-19
  • 打赏
  • 举报
回复
下面看正确的调用方法:

declare
l_emprow emp%rowtype;
TYPE emp_cur_type IS REF CURSOR RETURN emp%ROWTYPE;
l_mycur emp_cur_type;
begin
p_2(l_mycur);

loop
fetch l_mycur
into l_emprow;
exit when l_mycur%notfound;

dbms_output.put_line(l_emprow.empno);
end loop;
end;
majy 2009-08-19
  • 打赏
  • 举报
回复
肯定不是游标嵌套的问题,没有程序和数据,无法瞎猜,看我的例子:

create or replace procedure p_1(p_cur out sys_refcursor) as
begin
open p_cur for
select * from emp;
end;


create or replace procedure p_2(p_cur out sys_refcursor) as
l_cur sys_refcursor;
begin
p_1(l_cur);
p_cur := l_cur;
end;

9iSQL> var l_mycur refcursor;
9iSQL> exec p_2(:l_mycur);

PL/SQL procedure successfully completed.

9iSQL> print l_mycur;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 1101 17-DEC-80 800 20
7499 ALLEN SALESMAN 1101 20-FEB-81 1600 300 30
7521 WARD SALESMAN 1101 22-FEB-81 1250 500 30
7566 JONES MANAGER 1101 02-APR-81 2975 20
7654 MARTIN SALESMAN 1101 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 1101 01-MAY-81 2850 30
7782 CLARK MANAGER 1101 09-JUN-81 2450 10
7788 SCOTT ANALYST 1101 19-APR-87 3000 20
hustsay23 2009-08-19
  • 打赏
  • 举报
回复
是的啊 肯定用传进来的游标给要调用的游标啊
opps_zhou 2009-08-19
  • 打赏
  • 举报
回复
调用了P_1 将P_1返回的游标给了v_csr_2
你这个过程怎么实现的?
是不是 p_1(v_IDGroup2, v_csr_2);

17,377

社区成员

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

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