有人可以帮我理解错误代码:
ORA-24333:零迭代次数
我有时会在执行程序时遇到(在包中)?
这是随机的,我找不到这个问题的根源。
解释这种情况:我需要计算几个查询的结果集中的行数。
应用程序端在辅助线程中,调用过程
PROC_COUNTER(p1 IN, p2 IN, Cursor_out OUT SYS_REFCURSOR)
过程PROC_COUNTER包含几个过程调用,它们填充全局临时表(在提交保留行上),如下所示:
PROC_COUNTER(p1 IN, p2 IN, Cursor_out OUT SYS_REFCURSOR) IS
BEGIN
PROC_1(); -- 1st global temporary table (truncate gtt_1 following by INSERT INTO gtt_1 from v_gtt_1)
PROC_2(); -- 2nde global temporary table (truncate gtt_2 following by INSERT INTO gtt_2 from v_gtt_2)
PROC_3(); -- 3th global temporary table (truncate gtt_3 following by INSERT INTO gtt_3 from v_gtt_3)
PROC_4(); -- 4th global temporary table (truncate gtt_4 following by INSERT INTO gtt_4 from v_gtt_4)
OPEN CURSOR_OUT FOR sSql_ALL; --- sSQL_all is the query to execute
END PROC_COUNTER;
sSql_ALL包含由UNION ALL链接的6个子查询,如下所示:
SELECT 'VUE_1' AS VUE,
COUNT(distinct TBL_MASTER.seq_TBL_MASTER) AS NBR_LIGNE
FROM TBL_MASTER
/**/
JOIN TBL_1 ON TBL_1.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
JOIN TBL_2 ON TBL_2.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
LEFT JOIN TBL_3 ON TBL_3.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
JOIN TBL_4_GTT_GTT ON TBL_4_GTT.SEQ_NG_FONDS = TBL_MASTER.SEQ_NG_FONDS
/**/
LEFT JOIN TBL_5_GTT ON TBL_5_GTT.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
LEFT JOIN TBL_6 ON (TBL_6.SEQ_DEVISE_BASE = TBL_MASTER.SEQ_DEVICE AND TBL_6.SEQ_DEVISE_CONTRE_VALEUR = 4 )
/**/
LEFT JOIN TBL_7_GTT ON TBL_7_GTT.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
JOIN TBL_8_GTT ON TBL_8_GTT.TRADING_ENTITY = TBL_2.ENTITY_RATTACHEMENT
UNION ALL
SELECT 'VUE_2' AS VUE, COUNT(distinct TBL_MASTER.seq_TBL_MASTER) AS NBR_LIGNE
FROM TBL_MASTER
/**/
JOIN TBL_1 ON TBL_1.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
JOIN TBL_2 ON TBL_2.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
LEFT JOIN TBL_3 ON TBL_3.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
JOIN TBL_4_GTT ON TBL_4_GTT.SEQ_NG_FONDS = TBL_MASTER.SEQ_NG_FONDS
/**/
LEFT JOIN TBL_5_GTT ON TBL_5_GTT.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
LEFT JOIN TBL_6 ON (TBL_6.SEQ_DEVISE_BASE = TBL_MASTER.SEQ AND TBL_6.SEQ = 4 )
/**/
LEFT JOIN TBL_7_GTT ON TBL_7_GTT.SEQ_TBL_MASTER = TBL_MASTER.SEQ_TBL_MASTER
/**/
JOIN TBL_8_GTT ON TBL_8_GTT.TRADING_ENTITY = TBL_2.ENTITY_RATTACHEMENT
WHERE TBL_MASTER.STATUS = 'STATUS'
注意:*** _ GTT是一个全球临时表
经过多次测试后,即使修改了程序以保持最小代码如下:我得到错误“零迭代计数”。
PROCEDURE PROC_COUNTER(SEQ_ IN NUMBER, ENT_p IN VARCHAR2 := null, CURSOR_OUT OUT SYS_REFCURSOR) IS
sSql_1 varchar2(4000);
sSql_2 varchar2(4000);
sSql_3 varchar2(4000);
sSql_4 varchar2(4000);
sSql_5 varchar2(4000);
sSql_6 varchar2(4000);
sSql_7 varchar2(4000);
sSql_8 varchar2(4000);
BEGIN
DBMS_OUTPUT.PUT_LINE('[START] - PROC_COUNTER');
OPEN CURSOR_OUT FOR SELECT 'ALL' AS VUE, 999 AS NBR_LIGNE FROM DUAL;
DBMS_OUTPUT.PUT_LINE('[END] - PROC_COUNTER');
END PROC_COUNTER;
有关信息,我使用对oracle的本机访问,并通过以下应用程序调用我的过程:
BEGIN
PKG.PROC_COUNTER(2000, null, :return_value_compteur%CURSOR);
END;