/ * + APPEND_VALUES * / или / * + APPEND * /, который является эффективным для операции вставки в Oracle - PullRequest
0 голосов
/ 01 июля 2019

Я написал одну процедуру, которая будет вставлять данные из основной таблицы в рабочую таблицу. Это своего рода репликация данных из одной таблицы в другую. Таким образом, за один раз в рабочую таблицу будет вставлено более 2-5 миллионов данных. Теперь я столкнулся с проблемой производительности здесь.

Я не могу использовать оператор forall при операции DML, так как перед вставкой существует много условий if-else.

Итак, я использовал такие подсказки, как / * + APPEND_VALUES / и / + APPEND * /. Но я не уверен, какой из них подойдет для этого.

PROCEDURE process_assets 


  CURSOR c_get_unprocessed_rcd (p_last_run_date    DATE,
                                p_cur_run_date     DATE)
  IS
       SELECT ROWID,
              covered_line_id,
              op_type,
              seq_id,
              NRT_CREATION_DATE,
              NRT_last_update_DATE,
              contract_id,
              service_line_id,
              gg_create_date,
              instance_id,
              item_type_flag,
              nvl(old_item_type_flag,item_type_flag) old_item_type_flag
         FROM XXCCS_DS_CVDLIB_DTLEB_ES
        WHERE TRGT_CREATE_DATE BETWEEN p_last_run_date AND p_cur_run_date
     ORDER BY seq_id ASC;

  TYPE l_get_unprocessed_type IS TABLE OF c_get_unprocessed_rcd%ROWTYPE
     INDEX BY PLS_INTEGER;

  l_get_unprocessed_rcd   l_get_unprocessed_type;

НАЧАТЬ

  OPEN c_get_unprocessed_rcd (p_last_run_date, p_cur_run_date);

  LOOP
     EXIT WHEN c_get_unprocessed_rcd%NOTFOUND;

     FETCH c_get_unprocessed_rcd
        BULK COLLECT INTO l_get_unprocessed_rcd
        LIMIT 10000;


     FOR i IN l_get_unprocessed_rcd.FIRST .. l_get_unprocessed_rcd.LAST
     LOOP
        BEGIN
           if
            l_get_unprocessed_rcd (i).op_type = 'I'
           THEN
              BEGIN 

                 INSERT
                   INTO XXCCS_UEE_SRVC_ES_ACT_KEY (covered_line_id,
                                                   instance_id,
                                                   seq_id,
                                                   OP_TYPE,
                                                   SOT_TABLE,
                                                   SOT_CREATE_DATE,
                                                   SOT_LAST_UPDATE_DATE,
                                                   GG_CREATE_DATE,
                                                   contract_id,
                                                   item_type_flag)
                 VALUES (l_get_unprocessed_rcd (i).covered_line_id,
                         l_get_unprocessed_rcd (i).instance_id,
                         l_get_unprocessed_rcd (i).seq_id,
                         l_get_unprocessed_rcd (i).op_type,
                         L_SOT_TABLE_NAME,
                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                         l_get_unprocessed_rcd (i).contract_id,
                         l_get_unprocessed_rcd (i).item_type_flag);



                 INSERT
                   INTO XXCCS_UEE_DEVC_ES_CVD_KEY_V3 (instance_id,
                                                   OP_TYPE,
                                                   SOT_TABLE,
                                                   SOT_CREATE_DATE,
                                                   SOT_LAST_UPDATE_DATE,
                                                   GG_CREATE_DATE,
                                                   seq_id,
                                                   item_type_flag)
                 VALUES (l_get_unprocessed_rcd (i).instance_id,
                         l_get_unprocessed_rcd (i).op_type,
                         L_SOT_TABLE_NAME,
                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                         l_get_unprocessed_rcd (i).seq_id,
                         l_get_unprocessed_rcd (i).item_type_flag);


              END;

           ELSIF l_get_unprocessed_rcd (i).op_type = 'U'
           THEN
              BEGIN 
                 INSERT
                   INTO XXCCS_UEE_SRVC_ES_ACT_KEY (covered_line_id,
                                                   instance_id,
                                                   seq_id,
                                                   OP_TYPE,
                                                   SOT_TABLE,
                                                   SOT_CREATE_DATE,
                                                   SOT_LAST_UPDATE_DATE,
                                                   GG_CREATE_DATE,
                                                   contract_id,
                                                   item_type_flag)
                 VALUES (l_get_unprocessed_rcd (i).covered_line_id,
                         l_get_unprocessed_rcd (i).instance_id,
                         l_get_unprocessed_rcd (i).seq_id,
                         l_get_unprocessed_rcd (i).op_type,
                         L_SOT_TABLE_NAME,
                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                         l_get_unprocessed_rcd (i).contract_id,
                         l_get_unprocessed_rcd (i).item_type_flag);



                 INSERT
                   INTO XXCCS_UEE_DEVC_ES_CVD_KEY_V3 (instance_id,
                                                   OP_TYPE,
                                                   SOT_TABLE,
                                                   SOT_CREATE_DATE,
                                                   SOT_LAST_UPDATE_DATE,
                                                   GG_CREATE_DATE,
                                                   seq_id,
                                                   item_type_flag)
                 VALUES (l_get_unprocessed_rcd (i).instance_id,
                         l_get_unprocessed_rcd (i).op_type,
                         L_SOT_TABLE_NAME,
                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                         l_get_unprocessed_rcd (i).seq_id,
                         l_get_unprocessed_rcd (i).item_type_flag);



                 IF (l_get_unprocessed_rcd (i).item_type_flag in('P','S') AND  l_get_unprocessed_rcd (i).old_item_type_flag IN('C'))
                    OR
                    (l_get_unprocessed_rcd (i).item_type_flag in('C') AND  l_get_unprocessed_rcd (i).old_item_type_flag IN('P','S')) 
                 THEN
                    BEGIN
                         INSERT
                           INTO XXCCS_UEE_SRVC_ES_ACT_KEY (covered_line_id,
                                                           instance_id,
                                                           seq_id,
                                                           OP_TYPE,
                                                           SOT_TABLE,
                                                           SOT_CREATE_DATE,
                                                           SOT_LAST_UPDATE_DATE,
                                                           GG_CREATE_DATE,
                                                           contract_id,
                                                           item_type_flag)
                         VALUES (l_get_unprocessed_rcd (i).covered_line_id,
                                 l_get_unprocessed_rcd (i).instance_id,
                                 l_get_unprocessed_rcd (i).seq_id,
                                 'D',
                                 L_SOT_TABLE_NAME,
                                 l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                                 l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                                 l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                                 l_get_unprocessed_rcd (i).contract_id,
                                 l_get_unprocessed_rcd (i).old_item_type_flag);



                         INSERT
                           INTO XXCCS_UEE_DEVC_ES_CVD_KEY_V3 (instance_id,
                                                           OP_TYPE,
                                                           SOT_TABLE,
                                                           SOT_CREATE_DATE,
                                                           SOT_LAST_UPDATE_DATE,
                                                           GG_CREATE_DATE,
                                                           seq_id,
                                                           item_type_flag)
                         VALUES (l_get_unprocessed_rcd (i).instance_id,
                                 'D',
                                 L_SOT_TABLE_NAME,
                                 l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                                 l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                                 l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                                 l_get_unprocessed_rcd (i).seq_id,
                                 l_get_unprocessed_rcd (i).old_item_type_flag);




                    END;
                END IF;
              END;       

           ELSE
              BEGIN
                 INSERT
                   INTO XXCCS_UEE_SRVC_ES_ACT_KEY (covered_line_id,
                                                   instance_id,
                                                   seq_id,
                                                   OP_TYPE,
                                                   SOT_TABLE,
                                                   SOT_CREATE_DATE,
                                                   SOT_LAST_UPDATE_DATE,
                                                   GG_CREATE_DATE,
                                                   contract_id,
                                                   item_type_flag)
                 VALUES (l_get_unprocessed_rcd (i).covered_line_id,
                         l_get_unprocessed_rcd (i).instance_id,
                         l_get_unprocessed_rcd (i).seq_id,
                         l_get_unprocessed_rcd (i).op_type,
                         L_SOT_TABLE_NAME,
                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                         l_get_unprocessed_rcd (i).contract_id,
                         l_get_unprocessed_rcd (i).item_type_flag);

НАЧАТЬ ВЫБЕРИТЕ СЧЕТ (1) INTO l_cvd_exists ОТ XXCCS_DS_CVDLINEIB_DETAILEB ГДЕ instance_id = l_get_unprocessed_rcd (i) .instance_id;

                    IF l_cvd_exists = 0
                    THEN
                       INSERT
                         INTO XXCCS_UEE_DEVC_ES_CVD_KEY_V3 (
                                 instance_id,
                                 OP_TYPE,
                                 SOT_TABLE,
                                 SOT_CREATE_DATE,
                                 SOT_LAST_UPDATE_DATE,
                                 GG_CREATE_DATE,
                                 seq_id,
                                 item_type_flag)
                          VALUES (
                                    l_get_unprocessed_rcd (i).instance_id,
                                    l_get_unprocessed_rcd (i).op_type,
                                    L_SOT_TABLE_NAME,
                                    l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                                    l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                                    l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                                    l_get_unprocessed_rcd (i).seq_id,
                                    l_get_unprocessed_rcd (i).item_type_flag);
                    ELSE
                       INSERT
                         INTO XXCCS_UEE_DEVC_ES_CVD_KEY_V3 (
                                 instance_id,
                                 OP_TYPE,
                                 SOT_TABLE,
                                 SOT_CREATE_DATE,
                                 SOT_LAST_UPDATE_DATE,
                                 GG_CREATE_DATE,
                                 seq_id,
                                 item_type_flag)
                          VALUES (
                                    l_get_unprocessed_rcd (i).instance_id,
                                    'U',
                                    L_SOT_TABLE_NAME,
                                    l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
                                    l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
                                    l_get_unprocessed_rcd (i).GG_CREATE_DATE,
                                    l_get_unprocessed_rcd (i).seq_id,
                                    l_get_unprocessed_rcd (i).item_type_flag);
                    END IF;
                    end;
                         end;


                         ------- Like this if else block condition will continue

здесь репликация происходит от XXCCS_DS_CVDLIB_DTLEB_ES до XXCCS_UEE_SRVC_ES_ACT_KEY, XXCCS_UEE_DEVC_ES_CVD_KEY для этих двух таблиц

Итак, мне нужно выполнить это за минимальное время. Кто-нибудь может подсказать, какие подсказки я могу использовать с запросом вставки, или мы можем использовать любой другой метод для выполнения

Ответы [ 3 ]

3 голосов
/ 01 июля 2019

Прежде всего, они оба служат разным целям.

  • APPEND используется только при наличии команды ВСТАВИТЬ из SELECT: «ВСТАВИТЬ В ... (ВЫБРАТЬ * ОТ ...)»

  • APPEND_VALUES был введен в последнее время для: «INSERT INTO ... VALUES (...). Этот совет также можно использовать для массовых операций.

Обе подсказки имеют различные ограничения и могут игнорироваться в различных ситуациях. См. Почему Подсказка добавления игнорируется

IHMO, если вы заботитесь о производительности оператора вставки, попробуйте сначала сосредоточиться на

  • запускает накладные расходы
  • ограничение накладных расходов
  • затраты на обслуживание индекса

Также проверьте план выполнения операторов INSERT, пока ваша процедура выполняется. Если вы видите:

  • LOAD TABLE CONVENTIONAL - тогда подсказка APPEND по какой-то причине игнорируется
  • ЗАГРУЗИТЬ ТАБЛИЦУ КАК ВЫБРАТЬ - используется прямая загрузка пути, и подсказка ПРИЛОЖЕНИЯ находится на виду
0 голосов
/ 01 июля 2019

Я должен сказать, что вы можете использовать FORALL.

Я пытался преобразовать вашу IF-ELSE логику в FORALL.

Вам просто нужно добавить условие WHEREв FORALL согласно логике.

Посмотрите на следующий код:

PROCEDURE PROCESS_ASSETS AS

    CURSOR C_GET_UNPROCESSED_RCD (
        P_LAST_RUN_DATE DATE,
        P_CUR_RUN_DATE DATE
    ) IS
    SELECT
        ROWID,
        COVERED_LINE_ID,
        OP_TYPE,
        SEQ_ID,
        NRT_CREATION_DATE,
        NRT_LAST_UPDATE_DATE,
        CONTRACT_ID,
        SERVICE_LINE_ID,
        GG_CREATE_DATE,
        INSTANCE_ID,
        ITEM_TYPE_FLAG,
        NVL(OLD_ITEM_TYPE_FLAG, ITEM_TYPE_FLAG) OLD_ITEM_TYPE_FLAG
    FROM
        XXCCS_DS_CVDLIB_DTLEB_ES;
              --   ORDER BY seq_id ASC; -- not needed

    TYPE L_GET_UNPROCESSED_TYPE IS
        TABLE OF C_GET_UNPROCESSED_RCD%ROWTYPE INDEX BY PLS_INTEGER;
    L_GET_UNPROCESSED_RCD   L_GET_UNPROCESSED_TYPE;

BEGIN 

OPEN C_GET_UNPROCESSED_RCD; LOOP
    EXIT WHEN C_GET_UNPROCESSED_RCD%NOTFOUND;

    FETCH C_GET_UNPROCESSED_RCD BULK COLLECT INTO L_GET_UNPROCESSED_RCD LIMIT 10000;

    FORALL I IN 1..L_GET_UNPROCESSED_RCD.COUNT
        INSERT INTO XXCCS_UEE_SRVC_ES_ACT_KEY (
            COVERED_LINE_ID,
            INSTANCE_ID,
            SEQ_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            CONTRACT_ID,
            ITEM_TYPE_FLAG
        )
            SELECT
                L_GET_UNPROCESSED_RCD(I).COVERED_LINE_ID,
                L_GET_UNPROCESSED_RCD(I).INSTANCE_ID,
                L_GET_UNPROCESSED_RCD(I).SEQ_ID,
                L_GET_UNPROCESSED_RCD(I).OP_TYPE,
                L_SOT_TABLE_NAME,
                L_GET_UNPROCESSED_RCD(I).NRT_CREATION_DATE,
                L_GET_UNPROCESSED_RCD(I).NRT_LAST_UPDATE_DATE,
                L_GET_UNPROCESSED_RCD(I).GG_CREATE_DATE,
                L_GET_UNPROCESSED_RCD(I).CONTRACT_ID,
                L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG
            FROM
                DUAL
            WHERE
                L_GET_UNPROCESSED_RCD(I).OP_TYPE = 'I'; -- added this condition from your IF-ELSE

--
--

    FORALL I IN 1..L_GET_UNPROCESSED_RCD.COUNT
        INSERT INTO XXCCS_UEE_DEVC_ES_CVD_KEY (
            INSTANCE_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            SEQ_ID,
            ITEM_TYPE_FLAG
        )
            SELECT
                L_GET_UNPROCESSED_RCD(I).INSTANCE_ID,
                L_GET_UNPROCESSED_RCD(I).OP_TYPE,
                L_SOT_TABLE_NAME,
                L_GET_UNPROCESSED_RCD(I).NRT_CREATION_DATE,
                L_GET_UNPROCESSED_RCD(I).NRT_LAST_UPDATE_DATE,
                L_GET_UNPROCESSED_RCD(I).GG_CREATE_DATE,
                L_GET_UNPROCESSED_RCD(I).SEQ_ID,
                L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG
            FROM
                DUAL
            WHERE
                L_GET_UNPROCESSED_RCD(I).OP_TYPE = 'I'; -- added this condition from your IF-ELSE
--
--

    FORALL I IN 1..L_GET_UNPROCESSED_RCD.COUNT
        INSERT INTO XXCCS_UEE_SRVC_ES_ACT_KEY (
            COVERED_LINE_ID,
            INSTANCE_ID,
            SEQ_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            CONTRACT_ID,
            ITEM_TYPE_FLAG
        )
            SELECT
                L_GET_UNPROCESSED_RCD(I).COVERED_LINE_ID,
                L_GET_UNPROCESSED_RCD(I).INSTANCE_ID,
                L_GET_UNPROCESSED_RCD(I).SEQ_ID,
                L_GET_UNPROCESSED_RCD(I).OP_TYPE,
                L_SOT_TABLE_NAME,
                L_GET_UNPROCESSED_RCD(I).NRT_CREATION_DATE,
                L_GET_UNPROCESSED_RCD(I).NRT_LAST_UPDATE_DATE,
                L_GET_UNPROCESSED_RCD(I).GG_CREATE_DATE,
                L_GET_UNPROCESSED_RCD(I).CONTRACT_ID,
                L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG
            FROM
                DUAL
            WHERE
                L_GET_UNPROCESSED_RCD(I).OP_TYPE = 'U'; -- added this condition from your IF-ELSE
--
--
--
--

    FORALL I IN 1..L_GET_UNPROCESSED_RCD.COUNT
        INSERT INTO XXCCS_UEE_DEVC_ES_CVD_KEY (
            INSTANCE_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            SEQ_ID,
            ITEM_TYPE_FLAG
        )
            SELECT
                L_GET_UNPROCESSED_RCD(I).INSTANCE_ID,
                L_GET_UNPROCESSED_RCD(I).OP_TYPE,
                L_SOT_TABLE_NAME,
                L_GET_UNPROCESSED_RCD(I).NRT_CREATION_DATE,
                L_GET_UNPROCESSED_RCD(I).NRT_LAST_UPDATE_DATE,
                L_GET_UNPROCESSED_RCD(I).GG_CREATE_DATE,
                L_GET_UNPROCESSED_RCD(I).SEQ_ID,
                L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG
            FROM
                DUAL
            WHERE
                L_GET_UNPROCESSED_RCD(I).OP_TYPE = 'U'; -- added this condition from your IF-ELSE

--
--

    FORALL I IN 1..L_GET_UNPROCESSED_RCD.COUNT
        INSERT INTO XXCCS_UEE_SRVC_ES_ACT_KEY (
            COVERED_LINE_ID,
            INSTANCE_ID,
            SEQ_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            CONTRACT_ID,
            ITEM_TYPE_FLAG
        )
            SELECT
                L_GET_UNPROCESSED_RCD(I).COVERED_LINE_ID,
                L_GET_UNPROCESSED_RCD(I).INSTANCE_ID,
                L_GET_UNPROCESSED_RCD(I).SEQ_ID,
                'D',
                L_SOT_TABLE_NAME,
                L_GET_UNPROCESSED_RCD(I).NRT_CREATION_DATE,
                L_GET_UNPROCESSED_RCD(I).NRT_LAST_UPDATE_DATE,
                L_GET_UNPROCESSED_RCD(I).GG_CREATE_DATE,
                L_GET_UNPROCESSED_RCD(I).CONTRACT_ID,
                L_GET_UNPROCESSED_RCD(I).OLD_ITEM_TYPE_FLAG
            FROM
                DUAL
            WHERE -- added this condition from your IF-ELSE
                L_GET_UNPROCESSED_RCD(I).OP_TYPE = 'U'
                AND ( ( L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG IN (
                    'P',
                    'S'
                )
                        AND L_GET_UNPROCESSED_RCD(I).OLD_ITEM_TYPE_FLAG IN (
                    'C'
                ) )
                      OR ( L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG IN (
                    'C'
                )
                           AND L_GET_UNPROCESSED_RCD(I).OLD_ITEM_TYPE_FLAG IN (
                    'P',
                    'S'
                ) ) );

--
--

    FORALL I IN 1..L_GET_UNPROCESSED_RCD.COUNT
        INSERT INTO XXCCS_UEE_DEVC_ES_CVD_KEY (
            INSTANCE_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            SEQ_ID,
            ITEM_TYPE_FLAG
        )
            SELECT
                L_GET_UNPROCESSED_RCD(I).INSTANCE_ID,
                'D',
                L_SOT_TABLE_NAME,
                L_GET_UNPROCESSED_RCD(I).NRT_CREATION_DATE,
                L_GET_UNPROCESSED_RCD(I).NRT_LAST_UPDATE_DATE,
                L_GET_UNPROCESSED_RCD(I).GG_CREATE_DATE,
                L_GET_UNPROCESSED_RCD(I).SEQ_ID,
                L_GET_UNPROCESSED_RCD(I).OLD_ITEM_TYPE_FLAG
            FROM
                DUAL
            WHERE -- added this condition from your IF-ELSE
                L_GET_UNPROCESSED_RCD(I).OP_TYPE = 'U'
                AND ( ( L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG IN (
                    'P',
                    'S'
                )
                        AND L_GET_UNPROCESSED_RCD(I).OLD_ITEM_TYPE_FLAG IN (
                    'C'
                ) )
                      OR ( L_GET_UNPROCESSED_RCD(I).ITEM_TYPE_FLAG IN (
                    'C'
                )
                           AND L_GET_UNPROCESSED_RCD(I).OLD_ITEM_TYPE_FLAG IN (
                    'P',
                    'S'
                ) ) );

     -- YOUR OLD CODE --
     -------------------
     -------------------
     -------------------
     -------------------
     -------------------

--     FOR i IN l_get_unprocessed_rcd.FIRST .. l_get_unprocessed_rcd.LAST
--     LOOP--2
--        BEGIN--3
--           if
--            l_get_unprocessed_rcd (i).op_type = 'I'
--           THEN
--              BEGIN
--
--                 INSERT
--                   INTO XXCCS_UEE_SRVC_ES_ACT_KEY (covered_line_id,
--                                                   instance_id,
--                                                   seq_id,
--                                                   OP_TYPE,
--                                                   SOT_TABLE,
--                                                   SOT_CREATE_DATE,
--                                                   SOT_LAST_UPDATE_DATE,
--                                                   GG_CREATE_DATE,
--                                                   contract_id,
--                                                   item_type_flag)
--                 VALUES (l_get_unprocessed_rcd (i).covered_line_id,
--                         l_get_unprocessed_rcd (i).instance_id,
--                         l_get_unprocessed_rcd (i).seq_id,
--                         l_get_unprocessed_rcd (i).op_type,
--                         L_SOT_TABLE_NAME,
--                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
--                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
--                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
--                         l_get_unprocessed_rcd (i).contract_id,
--                         l_get_unprocessed_rcd (i).item_type_flag);
--
--
--
--                 INSERT
--                   INTO XXCCS_UEE_DEVC_ES_CVD_KEY (instance_id,
--                                                   OP_TYPE,
--                                                   SOT_TABLE,
--                                                   SOT_CREATE_DATE,
--                                                   SOT_LAST_UPDATE_DATE,
--                                                   GG_CREATE_DATE,
--                                                   seq_id,
--                                                   item_type_flag)
--                 VALUES (l_get_unprocessed_rcd (i).instance_id,
--                         l_get_unprocessed_rcd (i).op_type,
--                         L_SOT_TABLE_NAME,
--                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
--                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
--                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
--                         l_get_unprocessed_rcd (i).seq_id,
--                         l_get_unprocessed_rcd (i).item_type_flag);
--
--
--
--           ELSIF l_get_unprocessed_rcd (i).op_type = 'U'
--           THEN
--              BEGIN 
--                 INSERT
--                   INTO XXCCS_UEE_SRVC_ES_ACT_KEY (covered_line_id,
--                                                   instance_id,
--                                                   seq_id,
--                                                   OP_TYPE,
--                                                   SOT_TABLE,
--                                                   SOT_CREATE_DATE,
--                                                   SOT_LAST_UPDATE_DATE,
--                                                   GG_CREATE_DATE,
--                                                   contract_id,
--                                                   item_type_flag)
--                 VALUES (l_get_unprocessed_rcd (i).covered_line_id,
--                         l_get_unprocessed_rcd (i).instance_id,
--                         l_get_unprocessed_rcd (i).seq_id,
--                         l_get_unprocessed_rcd (i).op_type,
--                         L_SOT_TABLE_NAME,
--                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
--                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
--                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
--                         l_get_unprocessed_rcd (i).contract_id,
--                         l_get_unprocessed_rcd (i).item_type_flag);
--
--
--
--                 INSERT
--                   INTO XXCCS_UEE_DEVC_ES_CVD_KEY (instance_id,
--                                                   OP_TYPE,
--                                                   SOT_TABLE,
--                                                   SOT_CREATE_DATE,
--                                                   SOT_LAST_UPDATE_DATE,
--                                                   GG_CREATE_DATE,
--                                                   seq_id,
--                                                   item_type_flag)
--                 VALUES (l_get_unprocessed_rcd (i).instance_id,
--                         l_get_unprocessed_rcd (i).op_type,
--                         L_SOT_TABLE_NAME,
--                         l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
--                         l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
--                         l_get_unprocessed_rcd (i).GG_CREATE_DATE,
--                         l_get_unprocessed_rcd (i).seq_id,
--                         l_get_unprocessed_rcd (i).item_type_flag);
--
--
--
--                 IF (l_get_unprocessed_rcd (i).item_type_flag in('P','S') AND  l_get_unprocessed_rcd (i).old_item_type_flag IN('C'))
--                    OR
--                    (l_get_unprocessed_rcd (i).item_type_flag in('C') AND  l_get_unprocessed_rcd (i).old_item_type_flag IN('P','S')) 
--                 THEN
--                    BEGIN
--                         INSERT
--                           INTO XXCCS_UEE_SRVC_ES_ACT_KEY (covered_line_id,
--                                                           instance_id,
--                                                           seq_id,
--                                                           OP_TYPE,
--                                                           SOT_TABLE,
--                                                           SOT_CREATE_DATE,
--                                                           SOT_LAST_UPDATE_DATE,
--                                                           GG_CREATE_DATE,
--                                                           contract_id,
--                                                           item_type_flag)
--                         VALUES (l_get_unprocessed_rcd (i).covered_line_id,
--                                 l_get_unprocessed_rcd (i).instance_id,
--                                 l_get_unprocessed_rcd (i).seq_id,
--                                 'D',
--                                 L_SOT_TABLE_NAME,
--                                 l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
--                                 l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
--                                 l_get_unprocessed_rcd (i).GG_CREATE_DATE,
--                                 l_get_unprocessed_rcd (i).contract_id,
--                                 l_get_unprocessed_rcd (i).old_item_type_flag);
--
--
--
--                         INSERT
--                           INTO XXCCS_UEE_DEVC_ES_CVD_KEY (instance_id,
--                                                           OP_TYPE,
--                                                           SOT_TABLE,
--                                                           SOT_CREATE_DATE,
--                                                           SOT_LAST_UPDATE_DATE,
--                                                           GG_CREATE_DATE,
--                                                           seq_id,
--                                                           item_type_flag)
--                         VALUES (l_get_unprocessed_rcd (i).instance_id,
--                                 'D',
--                                 L_SOT_TABLE_NAME,
--                                 l_get_unprocessed_rcd (i).NRT_CREATION_DATE,
--                                 l_get_unprocessed_rcd (i).NRT_LAST_UPDATE_DATE,
--                                 l_get_unprocessed_rcd (i).GG_CREATE_DATE,
--                                 l_get_unprocessed_rcd (i).seq_id,
--                                 l_get_unprocessed_rcd (i).old_item_type_flag);


                         ------- Like this if else block condition will continue

-

-

--------- ОБНОВЛЕНИЕ ---------

Я полностью изменил свой ответ.Тебе это понравится.Я использовал INSERT ALL.Просто я не уверен, что такое L_SOT_TABLE_NAME.таким образом я рассмотрел это как String.Вы можете выбрать переменную и использовать ее соответственно в своей процедуре.

PROCEDURE PROCESS_ASSETS AS
BEGIN
INSERT
    ALL 

    -- 1

     WHEN OP_TYPE = 'I' THEN
        INTO XXCCS_UEE_SRVC_ES_ACT_KEY (
            COVERED_LINE_ID,
            INSTANCE_ID,
            SEQ_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            CONTRACT_ID,
            ITEM_TYPE_FLAG
        )
        VALUES (
            COVERED_LINE_ID,
            INSTANCE_ID,
            SEQ_ID,
            OP_TYPE,
            'L_SOT_TABLE_NAME',
            NRT_CREATION_DATE,
            NRT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            CONTRACT_ID,
            ITEM_TYPE_FLAG
        )

        --2

        WHEN OP_TYPE = 'I' THEN
            INTO XXCCS_UEE_DEVC_ES_CVD_KEY (
                INSTANCE_ID,
                OP_TYPE,
                SOT_TABLE,
                SOT_CREATE_DATE,
                SOT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                SEQ_ID,
                ITEM_TYPE_FLAG
            )
            VALUES (
                INSTANCE_ID,
                OP_TYPE,
                'L_SOT_TABLE_NAME',
                NRT_CREATION_DATE,
                NRT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                SEQ_ID,
                ITEM_TYPE_FLAG
            )

        --3

        WHEN OP_TYPE = 'U' THEN
            INTO XXCCS_UEE_SRVC_ES_ACT_KEY (
                COVERED_LINE_ID,
                INSTANCE_ID,
                SEQ_ID,
                OP_TYPE,
                SOT_TABLE,
                SOT_CREATE_DATE,
                SOT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                CONTRACT_ID,
                ITEM_TYPE_FLAG
            )
            VALUES (
                COVERED_LINE_ID,
                INSTANCE_ID,
                SEQ_ID,
                OP_TYPE,
                'L_SOT_TABLE_NAME',
                NRT_CREATION_DATE,
                NRT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                CONTRACT_ID,
                ITEM_TYPE_FLAG
            )

        -- 4

        WHEN OP_TYPE = 'U' THEN
            INTO XXCCS_UEE_DEVC_ES_CVD_KEY (
                INSTANCE_ID,
                OP_TYPE,
                SOT_TABLE,
                SOT_CREATE_DATE,
                SOT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                SEQ_ID,
                ITEM_TYPE_FLAG
            )
            VALUES (
                INSTANCE_ID,
                OP_TYPE,
                'L_SOT_TABLE_NAME',
                NRT_CREATION_DATE,
                NRT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                SEQ_ID,
                ITEM_TYPE_FLAG
            )

        -- 5

        WHEN OP_TYPE = 'U'
             AND ( ( ITEM_TYPE_FLAG IN (
            'P',
            'S'
        )
                     AND OLD_ITEM_TYPE_FLAG IN (
            'C'
        ) )
                   OR ( ITEM_TYPE_FLAG IN (
            'C'
        )
                        AND OLD_ITEM_TYPE_FLAG IN (
            'P',
            'S'
        ) ) ) THEN
            INTO XXCCS_UEE_SRVC_ES_ACT_KEY (
                COVERED_LINE_ID,
                INSTANCE_ID,
                SEQ_ID,
                OP_TYPE,
                SOT_TABLE,
                SOT_CREATE_DATE,
                SOT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                CONTRACT_ID,
                ITEM_TYPE_FLAG
            )
            VALUES (
                COVERED_LINE_ID,
                INSTANCE_ID,
                SEQ_ID,
                'D',
                'L_SOT_TABLE_NAME',
                NRT_CREATION_DATE,
                NRT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                CONTRACT_ID,
                OLD_ITEM_TYPE_FLAG
            )

        -- 6

        WHEN OP_TYPE = 'U'
             AND ( ( ITEM_TYPE_FLAG IN (
            'P',
            'S'
        )
                     AND OLD_ITEM_TYPE_FLAG IN (
            'C'
        ) )
                   OR ( ITEM_TYPE_FLAG IN (
            'C'
        )
                        AND OLD_ITEM_TYPE_FLAG IN (
            'P',
            'S'
        ) ) ) THEN
            INTO XXCCS_UEE_DEVC_ES_CVD_KEY (
                INSTANCE_ID,
                OP_TYPE,
                SOT_TABLE,
                SOT_CREATE_DATE,
                SOT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                SEQ_ID,
                ITEM_TYPE_FLAG
            )
            VALUES (
                INSTANCE_ID,
                'D',
                'L_SOT_TABLE_NAME',
                NRT_CREATION_DATE,
                NRT_LAST_UPDATE_DATE,
                GG_CREATE_DATE,
                SEQ_ID,
                OLD_ITEM_TYPE_FLAG
            )

        -- 7

    ELSE
        INTO XXCCS_UEE_SRVC_ES_ACT_KEY (
            COVERED_LINE_ID,
            INSTANCE_ID,
            SEQ_ID,
            OP_TYPE,
            SOT_TABLE,
            SOT_CREATE_DATE,
            SOT_LAST_UPDATE_DATE,
            GG_CREATE_DATE,
            CONTRACT_ID,
            ITEM_TYPE_FLAG
        )
    VALUES (
        COVERED_LINE_ID,
        INSTANCE_ID,
        SEQ_ID,
        OP_TYPE,
        'L_SOT_TABLE_NAME',
        NRT_CREATION_DATE,
        NRT_LAST_UPDATE_DATE,
        GG_CREATE_DATE,
        CONTRACT_ID,
        ITEM_TYPE_FLAG
    )
SELECT
    ROWID,
    COVERED_LINE_ID,
    OP_TYPE,
    SEQ_ID,
    NRT_CREATION_DATE,
    NRT_LAST_UPDATE_DATE,
    CONTRACT_ID,
    SERVICE_LINE_ID,
    GG_CREATE_DATE,
    INSTANCE_ID,
    ITEM_TYPE_FLAG,
    NVL(OLD_ITEM_TYPE_FLAG, ITEM_TYPE_FLAG) OLD_ITEM_TYPE_FLAG
FROM
    XXCCS_DS_CVDLIB_DTLEB_ES;

END PROCESS_ASSETS;
/

-

--------- ОБНОВЛЕНИЕ 2** ** ---------

-

Я обновил ответ, но поскольку существует ограничение в 30000 символов (в разделе «Ответ»)в StackOverflow я поставил ответ здесь .

Добавлены / изменены разделы - 7, 8, 9, 10 в обновленном ответе

Приветствия !!

0 голосов
/ 01 июля 2019

Если вы вставляете с прямым путем (что происходит при использовании append или append_values) строка за строкой, имейте в виду, что вы создадите новый экстент с каждым выполненным оператором вставки (или используйте существующий свободный экстент, если он доступен. Если нет, он создаст новый). Поэтому важно проверить скорость, но также проверить размер целевой таблицы.

Тест скорости APPEND VS APPEND_VALUES вы можете найти здесь (в двух словах, append_values быстрее append)

Некоторую сокращенную информацию об аппендиате вы также можете найти в этой статье базы оракула

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...