使用sys_refcursor调用SP作为另一个过程中的out参数

时间:2016-01-19 05:45:36

标签: oracle stored-procedures plsql sys-refcursor

我有一个SP

create or replace PROCEDURE         ALTERNATE_NAME_LOOKUP
 ( P_NAME IN VARCHAR2,
  P_TYPE IN VARCHAR2, retCursor OUT SYS_REFCURSOR
 )

我没有粘贴其余的身体;上面的程序可以自行运行(当然还有正文)

现在我想从另一个存储过程调用它,我想遍历refcursor。

我正在做的是声明an_last_cur SYS_REFCURSOR;并将{@ 1}}调用ALTERNATE_NAME_LOOKUP过程进行编译。 但是当我添加以下块时 -

ALTERNATE_NAME_LOOKUP(p_req.LASTNAMEEXP,c_LAST, an_last_cur);

它给出了编译错误 -

 ALTERNATE_NAME_LOOKUP('Roman Reigns','LAST',an_last_cur);
      For alt in an_last_cur
      Loop
        DBMS_OUTPUT.PUT_LINE('ok');
      end loop;

我做错了什么?

2 个答案:

答案 0 :(得分:3)

create or replace procedure alternate_name_lookup
 ( p_name in varchar2, p_type in varchar2, retcursor out sys_refcursor ) 
as
begin
  open retcursor for select * from user_objects ;     
end;

set serveroutput on
declare
  an_last_cur sys_refcursor;
  type my_objects is table of user_objects%rowtype;
  objects my_objects;
begin
  alternate_name_lookup('Roman Reigns','LAST',an_last_cur);

  fetch an_last_cur bulk collect into objects;
  dbms_output.put_line(objects.count);

  for indx in 1 .. objects.count 
  loop
    dbms_output.put_line(objects(indx).object_name);
  end loop;  

  close an_last_cur;
end;

答案 1 :(得分:1)

  

试试这个。希望这可以帮助。我没有工作空间,所以请原谅   语法错误,如果有的话。

CREATE OR REPLACE PROCEDURE test_ref_prc
  ( p_ref_out  OUT sys_refcursor)
AS
BEGIN
OPEN p_ref_out FOR
  SELECT LEVEL  FROM DUAL CONNECT BY LEVEL < 10;
END;

CREATE OR REPLACE PROCEDURE test_ref2
AS
refc sys_refcursor;
num_ntt NUMBER_NTT;
BEGIN
test_ref_prc(refc);
FETCH refc BULK COLLECT INTO num_ntt;
FOR I IN num_ntt.FIRST..num_ntt.LAST LOOP
dbms_output.put_line(num_ntt(i));
END LOOP;
END;

exec test_ref2;