首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle中的引用游标和存储过程

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

Stack Overflow用户
提问于 2012-07-10 06:27:25
回答 1查看 10.3K关注 0票数 1

我用PL/SQL编写了一个简单的存储过程,以执行相当于

代码语言:javascript
复制
   SELECT * FROM tablename

以下是返回引用游标的过程

代码语言:javascript
复制
   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提示符中执行我的过程时,而不想在代码中的引号中包含行,我就这样做。

代码语言:javascript
复制
   VARIABLE cr REFCURSOR
   EXEC proc_name(:cr)

现在我得到一个提示

代码语言:javascript
复制
   PL/SQL procedure successfully completed

现在,当我尝试执行命令时

代码语言:javascript
复制
   print cr;

我犯了个错误

代码语言:javascript
复制
   ORA-24338: Statement handle not executed

请帮我处理这个。我需要知道如何使用存储过程返回的引用游标打印表。我不想在过程本身中打印任何内容,因此我希望将行从过程中全部从引号中移除。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-10 09:19:59

您将得到一个错误,因为游标是由过程关闭的,因此不能“打印”。我建议如下:

  1. 在执行SQL*Plus中的过程之前,始终要运行SET SERVEROUTPUT ON,以便您可以看到DBMS_OUTPUT日志。使用此输出进行调试/日志记录。
  2. 如果要返回稍后将显示的游标,请不要在过程中获取游标: SQL>创建或替换过程p (x OUT SYS_REFCURSOR)是2 BEGIN 3,打开x表示SELECT * FROM;4 END;5/过程创建。SQL>变量x REFCURSOR;SQL> EXEC (:X);PL/SQL过程成功完成。SQL>打印x;注解-X

注意,调用应用程序(这里是SQL*Plus PRINT)的责任是正确地获取和关闭游标,而不是PL/SQL过程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11407767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档