1

我在 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

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

4

1 回答 1

1

你会得到一个错误,因为游标被过程关闭了,因此它不能被“打印”。我建议如下:

  1. 始终SET SERVEROUTPUT ON在 SQL*Plus 中执行您的过程之前运行,以便您可以看到您的DBMS_OUTPUT日志。使用此输出进行调试/记录。

  2. 如果要返回稍后将显示的游标,请不要在过程中获取游标:

    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 过程。

于 2012-07-10T09:19:59.600 回答