Stored procedures Oracle中的引用游标和存储过程

Stored procedures Oracle中的引用游标和存储过程,stored-procedures,plsql,oracle11g,ref-cursor,Stored Procedures,Plsql,Oracle11g,Ref Cursor,我用PL/SQL编写了一个简单的存储过程来执行 SELECT * FROM tablename 下面是返回引用游标的过程 create or replace procedure proc_name (outVal OUT sys_refcursor) as myCursor sys_refcursor; myRecords records%ROWTYPE; l_sql VARCHAR(2000); begin l_sql := 'SEL

我用PL/SQL编写了一个简单的存储过程来执行

   SELECT * FROM tablename
下面是返回引用游标的过程

   create or replace
   procedure proc_name (outVal OUT sys_refcursor) as
   myCursor sys_refcursor;
   myRecords records%ROWTYPE;
   l_sql VARCHAR(2000);
   begin
        l_sql := 'SELECT * FROM RECORDS';
        open myCursor for l_sql;
        loop
            FETCH myCursor INTO myRecords;
            EXIT WHEN myCursor%NOTFOUND;
            "DBMS_OUTPUT.put_line('myRecords.name =' || myRecords.name);"
        end loop;
   close myCursor;
   end;
现在,当我想在SQL命令提示符下执行过程,而不在代码中的引号中包含行时,我会这样做

   VARIABLE cr REFCURSOR
   EXEC proc_name(:cr)
现在我得到一个提示说

   PL/SQL procedure successfully completed
现在当我尝试执行命令时

   print cr;
我犯了一个错误

   ORA-24338: Statement handle not executed

请帮我做这个。我需要知道如何仅使用存储过程返回的这个引用游标来打印表。我不想打印过程本身中的任何内容,因此希望将引号中的行一起从过程中删除。

由于过程关闭了光标,因此无法“打印”光标,因此会出现错误。我建议如下:

  • 在SQL*Plus中执行过程之前,请始终运行
    SET SERVEROUTPUT ON
    ,以便查看
    DBMS\u输出
    日志。使用此输出进行调试/记录

  • 如果要返回稍后显示的光标,请不要在以下过程中获取光标:

    SQL> CREATE OR REPLACE PROCEDURE p (x OUT SYS_REFCURSOR) IS
      2  BEGIN
      3     OPEN x FOR SELECT * FROM DUAL;
      4  END;
      5  /
    
    Procedure created.
    
    SQL> VARIABLE x REFCURSOR;
    SQL> EXEC p(:x);
    
    PL/SQL procedure successfully completed.
    
    SQL> PRINT x;
    
    DUM
    ---
    X
    

  • 请注意,调用应用程序(此处为SQL*Plus
    PRINT
    )负责正确获取并关闭光标,而不是PL/SQL过程。

    您会收到一个错误,因为该过程关闭了光标,因此无法“打印”。我建议如下:

  • 在SQL*Plus中执行过程之前,请始终运行
    SET SERVEROUTPUT ON
    ,以便查看
    DBMS\u输出
    日志。使用此输出进行调试/记录

  • 如果要返回稍后显示的光标,请不要在以下过程中获取光标:

    SQL> CREATE OR REPLACE PROCEDURE p (x OUT SYS_REFCURSOR) IS
      2  BEGIN
      3     OPEN x FOR SELECT * FROM DUAL;
      4  END;
      5  /
    
    Procedure created.
    
    SQL> VARIABLE x REFCURSOR;
    SQL> EXEC p(:x);
    
    PL/SQL procedure successfully completed.
    
    SQL> PRINT x;
    
    DUM
    ---
    X
    
  • 请注意,调用应用程序(此处为SQL*Plus
    PRINT
    )负责正确获取和关闭光标,而不是PL/SQL过程