/*+ APPEND_VALUES */ 或 /*+ APPEND*/ ,对于oracle中的插入操作,哪个是有效的

/*+ APPEND_VALUES */ or /*+ APPEND*/ , which one is efficient one for insert operation in oracle

我写了一个程序,它将数据从 master table 插入到 working table 。它是一种从一个 table 到另一个 table 的数据复制。 因此,在工作中一次将插入超过 2-5 百万的数据 table。现在我在这里面临性能问题。

DML操作时不能用forall语句,插入前有很多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);

开始 SELECT 计数 (1) 进入 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 这两个 table

因此,我需要在最短的时间内执行此操作。谁能建议我可以使用插入查询的提示,或者我们可以使用任何其他方法来执行

如果您逐行插入直接路径(当您使用 appendappend_values 时会发生这种情况),请注意您将在每个插入语句中创建一个新的 extent发行(或使用现有的可用范围。如果没有,它将创建一个新的)。 所以测试速度很重要,但也要测试目标的大小 table.

APPEND VS APPEND_VALUES的速度测试可以发现here(简而言之,append_valuesappend快)

一些关于追加的精简信息你也可以在这里找到oracle base article

我必须说你可以使用 FORALL

我已尝试将您的 IF-ELSE 逻辑转换为 FORALL

You just need to add WHERE condition in FORALL according to logic.

看下面的代码:

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 ** **----------

--

我已经更新了答案,但是由于 Whosebug 中有 30000 个字符的限制(在答案部分),所以我把答案放在了 here

Added/Modified 新更新答案中的第 7、8、9、10 部分

干杯!!

首先,它们的用途不同。

  • APPEND 仅当您从 SELECT 插入时使用:"INSERT INTO ...(SELECT * FROM ...)"

  • APPEND_VALUES 最近引入了:“INSERT INTO ... VALUES(...)。此提示也可用于批量操作。

这两个提示都有各种限制,在各种情况下都可以忽略。参见 Why Append hint is ignored

IHMO 如果您确实关心插入语句的性能,请首先关注

  • 触发开销
  • 约束开销
  • 索引维护开销

同时检查 INSERT 语句的执行计划,同时是您的过程 运行。如果您看到:

  • LOAD TABLE CONVENTIONAL - 然后由于某种原因忽略 APPEND 提示
  • LOAD TABLE AS SELECT - 使用直接路径加载并且 APPEND 提示已在计划中