我无法打印从过程中打开的引用游标:
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;
/它编译时没有错误,但是当我调用它时,我不能打印输出参数值:
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"发布于 2016-06-02 22:59:42
ORA-24338错误是因为您在过程中关闭了p_out;从您的循环中删除该行
引用光标仍必须处于打开状态,客户端才能使用它。并且它保持打开,直到客户端会话结束或者它显式地关闭它。
也有可能显式游标c1永远找不到任何行,在这种情况下,它永远不会被打开,这在SQL中也会得到相同的错误。假设至少存在一个匹配的视图,那么多次打开ref游标是没有意义的(如果有多个视图,具有不同的所有者),所以您最好在第一次获取之后退出。
在循环中显式获取也是不正确的;但是,如果您真的这样做了,您将得到ORA-01001: invalid cursor。
所以你可以这样做:
...
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:
...
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;
/发布于 2016-06-02 23:10:06
问题出在不正确的PL/SQL过程中。for与fetch不兼容,不能同时使用。此外,您不能在返回之前关闭光标,否则它将不可用。
下面是一个正确步骤的示例:
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;发布于 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行。
https://stackoverflow.com/questions/37595057
复制相似问题