【问题标题】:Calling SP with sys_refcursor as out parameter inside another procedure在另一个过程中使用 sys_refcursor 作为 out 参数调用 SP
【发布时间】:2016-01-19 05:45:36
【问题描述】:

我有一个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; 并将 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;

它给出了编译错误 -

 PLS-00221: 'AN_LAST_CUR' is not a procedure or is undefined

我做错了什么?

【问题讨论】:

  • 当我将 sp 称为ALTERNATE_NAME_LOOKUP('Roman Reigns','LAST',:an_last_cur); 时,它会给出PLS-00049: bad bind variable 'AN_LAST_CUR'
  • 在这种情况下,Refcursors 并不是您应该考虑的解决方案。使用集合,然后根据需要传递它。

标签: oracle stored-procedures plsql sys-refcursor


【解决方案1】:
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;

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

    • 我正在尝试在当前过程中打开 sys_refcursor(ALTERNATE_NAME_LOOKUP 的输出)
    • 现在检查。希望这会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2015-01-19
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多