/*+ 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
因此,我需要在最短的时间内执行此操作。谁能建议我可以使用插入查询的提示,或者我们可以使用任何其他方法来执行
如果您逐行插入直接路径(当您使用 append
或 append_values
时会发生这种情况),请注意您将在每个插入语句中创建一个新的 extent发行(或使用现有的可用范围。如果没有,它将创建一个新的)。
所以测试速度很重要,但也要测试目标的大小 table.
APPEND VS APPEND_VALUES的速度测试可以发现here(简而言之,append_values
比append
快)
一些关于追加的精简信息你也可以在这里找到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 提示已在计划中
我写了一个程序,它将数据从 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
因此,我需要在最短的时间内执行此操作。谁能建议我可以使用插入查询的提示,或者我们可以使用任何其他方法来执行
如果您逐行插入直接路径(当您使用 append
或 append_values
时会发生这种情况),请注意您将在每个插入语句中创建一个新的 extent发行(或使用现有的可用范围。如果没有,它将创建一个新的)。
所以测试速度很重要,但也要测试目标的大小 table.
APPEND VS APPEND_VALUES的速度测试可以发现here(简而言之,append_values
比append
快)
一些关于追加的精简信息你也可以在这里找到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 提示已在计划中