首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法打印引用光标

无法打印引用光标
EN

Stack Overflow用户
提问于 2016-06-02 22:43:12
回答 3查看 608关注 0票数 0

我无法打印从过程中打开的引用游标:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE RMAN_COMMON.backup_report(P_OUT OUT sys_refcursor)
is
--P_OUT SYS_REFCURSOR;
NAME varchar2(100) ;

cursor c1
is
select owner || '.' || VIEW_NAME as NAME 
from  dba_views  
where owner like 'RMAN_%' 
and owner  !='RMAN_COMMON' 
and VIEW_NAME ='RC_RMAN_BACKUP_JOB_DETAILS';

BEGIN
    for rec1 in c1     
     Loop
fetch c1 into NAME;       
           OPEN P_OUT FOR 'SELECT db_name, start_time, end_time, input_type, status, time_taken_display, output_bytes_display, output_device_type FROM ' || NAME;

     close P_OUT;
     end loop;
end;
/

它编译时没有错误,但是当我调用它时,我不能打印输出参数值:

代码语言:javascript
复制
SQL> var rc2 refcursor;
SQL> execute backup_report(:rc2);

PL/SQL procedure successfully completed.

SQL>  print rc2
ERROR:
ORA-24338: statement handle not executed


SP2-0625: Error printing variable "rc2"
EN

回答 3

Stack Overflow用户

发布于 2016-06-02 22:59:42

ORA-24338错误是因为您在过程中关闭了p_out;从您的循环中删除该行

引用光标仍必须处于打开状态,客户端才能使用它。并且它保持打开,直到客户端会话结束或者它显式地关闭它。

也有可能显式游标c1永远找不到任何行,在这种情况下,它永远不会被打开,这在SQL中也会得到相同的错误。假设至少存在一个匹配的视图,那么多次打开ref游标是没有意义的(如果有多个视图,具有不同的所有者),所以您最好在第一次获取之后退出。

在循环中显式获取也是不正确的;但是,如果您真的这样做了,您将得到ORA-01001: invalid cursor

所以你可以这样做:

代码语言:javascript
复制
...
begin
    for rec1 in c1 loop
      open p_out for 'SELECT db_name, start_time, end_time, input_type, status, time_taken_display, output_bytes_display, output_device_type FROM '
        || rec1.NAME;
      exit; -- or return since you don't do anything after the loop
    end loop;
end;
/

或者避免循环,对变量执行一次fetch:

代码语言:javascript
复制
...
begin
    open c1;
    fetch c1 into NAME;
    open p_out for 'SELECT db_name, start_time, end_time, input_type, status, time_taken_display, output_bytes_display, output_device_type FROM '
      || NAME;
    close c1;
end;
/
票数 0
EN

Stack Overflow用户

发布于 2016-06-02 23:10:06

问题出在不正确的PL/SQL过程中。forfetch不兼容,不能同时使用。此外,您不能在返回之前关闭光标,否则它将不可用。

下面是一个正确步骤的示例:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE backup_report(P_OUT OUT sys_refcursor) IS
BEGIN

    FOR rec1 IN (
        SELECT owner || '.' || view_name AS name 
        FROM  dba_views  
        WHERE owner LIKE 'RMAN_%' 
        AND owner  !='RMAN_COMMON' 
        AND VIEW_NAME ='RC_RMAN_BACKUP_JOB_DETAILS';
    ) LOOP
           OPEN P_OUT FOR 'SELECT * FROM ' || rec1.NAME;
           RETURN;
     END LOOP;
END;
票数 0
EN

Stack Overflow用户

发布于 2016-06-03 21:40:15

我会根据你的答案重写代码。现在好多了,但是我只能从一个表RMAN_B2ETEST.RC_RMAN_BACKUP_JOB_DETAILS获得输出。动态表名是关键,我想肯定有一个循环。

CREATE OR REPLACE function RMAN_COMMON.backup_report返回sys_refcursor为

P_OUT SYS_REFCURSOR;

V_OWNER dba_views.owner%type;V_VIEW_NAME dba_views.view_name%type;

cursor c1是select owner,VIEW_NAME as NAME from dba_views where owner like 'RMAN_%‘and owner !='RMAN_COMMON’and VIEW_NAME ='RC_RMAN_BACKUP_JOB_DETAILS';

开始打开c1;fetch c1 into V_OWNER,V_VIEW_NAME;

为‘P_OUT db_name,start_time,end_time,input_type,status,time_taken_display,output_bytes_display,output_device_type FROM’|| V_OWNER ||‘打开状态。|| V_VIEW_NAME;return P_OUT;

关闭c1;

结束;/

从dual中选择backup_report();

。。。。B2ETEST 25-APR-16 25-APR-16数据库已满完成00:13:08 57.79G SBT_TAPE B2ETEST 15-5-16 15-5-16数据库已完成00:10:29 58.41G SBT_TAPE B2ETEST 18-5-16 18-5-16数据库已满完成时间00:35:14 58.42G SBT_TAPE B2ETEST 02-JUN-16 02-JUN-16数据库已满完成00:08:09 58.94G SBT_TAPE B2ETEST 11-MAR-16 11-MAR-16数据库已满完成00:10:3656.02G SBT_TAPE B2ETEST 27-MAR-16 27-MAR-16 DB FULL已完成00:10:37 56.36G SBT_TAPE B2ETEST 29-MAR-16 29-MAR-16 DB FULL已完成00:10:41 56.36GSBT_TAPE B2ETEST 31-MAR-16 31-MAR-16数据库已完成00:12:23 56.95G SBT_TAPE B2ETEST 02-APR-16 02-APR-16数据库已完成00:12:53 57.05G SBT_TAPE B2ETEST 24-APR-16 24-APR-16数据库已完全完成00:11:11 57.78G SBT_TAPE B2ETEST 29-APR-16 29-APR-16数据库已完全完成00:11:40 58.04G SBT_TAPE

DB_NAME START_TIM END_TIME INPUT_TYPE STATUS TIME_TAKEN_DISPLAY OUTPUT_BYTES_DISPLAY OUTPUT_DEVICE_TYP

B2ETEST 04-5-16 04-5-16 DB FULL COMPLETED 00:14:54 58.06G SBT_TAPE

选择了78行。

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

https://stackoverflow.com/questions/37595057

复制
相关文章

相似问题

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