一个程序可以有2个refcursor吗?

时间:2016-09-21 06:04:54

标签: sql oracle stored-procedures sys-refcursor

选择多行数据的存储过程

create or replace PROCEDURE tranferdata
(REFCUR OUT SYS_REFCURSOR,REFCUR2 OUT SYS_REFCURSOR)
AS
BEGIN

OPEN REFCUR FOR SELECT  distinct  b.GUARDIAN_ID, c.name,d.PHONE_NUMBER
from
student a,student_guardian b,guardian c,GUARDIAN_CONTACT d
where b.STUDENT_ID=a.student_id
and b.GUARDIAN_ID =c.GUARDIAN_ID
and c.GUARDIAN_ID=d.GUARDIAN_ID;

OPEN REFCUR2 FOR SELECT b.GUARDIAN_ID, c.name,d.PHONE_NUMBER
from
student a,student_guardian b,guardian c,GUARDIAN_CONTACT d, testarif e
where b.STUDENT_ID=a.student_id
and b.GUARDIAN_ID =c.GUARDIAN_ID
and c.GUARDIAN_ID=d.GUARDIAN_ID
and b.GUARDIAN_ID !=e.vv_guardian_id;


END;

匿名阻止调用程序

SET SERVEROUTPUT ON;
DECLARE
P_CURSOR SYS_REFCURSOR;
P_CURSOR2 SYS_REFCURSOR;
P_id VARCHAR2(100);
P_name VARCHAR2(100);
P_phone_no VARCHAR2(100);

PP_id VARCHAR2(100);
PP_name VARCHAR2(100);
PP_phone_no VARCHAR2(100);


BEGIN

DBMS_OUTPUT.PUT_LINE ('ATAS');

tranferdata(REFCUR,REFCUR2 => P_CURSOR,P_CURSOR2);



DBMS_OUTPUT.PUT_LINE ('BAWAH');

LOOP

FETCH P_CURSOR INTO P_id,P_name,P_phone_no;
insert into testarif(vv_guardian_id,vv_name,vv_phone) values (P_id, P_name, P_phone_no);
EXIT WHEN P_CURSOR%NOTFOUND;


END LOOP;

CLOSE P_CURSOR;


LOOP

FETCH P_CURSOR2 INTO PP_id,PP_name,PP_phone_no;

insert into testarif2(vvv_guardian_id,vvv_name,vvv_phone) values (PP_id, PP_name, PP_phone_no);
EXIT WHEN P_CURSOR2%NOTFOUND;


END LOOP;

CLOSE P_CURSOR2;

END;
/

错误是

  

ORA-06550:第17行,第13栏:
  PLS-00201:必须声明标识符'REFCUR'

     

ORA-06550:第17行,第1栏:

我找不到哪一个错误......

上面的代码在一个过程中使用2个refcursors是否有效?

1 个答案:

答案 0 :(得分:1)

您使用的语法不正确。 只需将tranferdata(REFCUR,REFCUR2 => P_CURSOR,P_CURSOR2);更改为tranferdata(REFCUR => P_CURSOR, REFCUR2 => P_CURSOR2);

即可