Oracle - 零迭代计数 - 包过程

时间:2016-07-18 15:26:03

标签: oracle stored-procedures plsql

有人可以帮我理解错误代码:

  

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;

0 个答案:

没有答案