Oracle PL/SQL如何输出FORALL语句中进行了多少次插入
获取和输出我下面的FORALL语句中插入了多少行的最佳方法是什么。我已经看到了SQL%BULK_行数,但我不确定在下面的语句中该如何工作 是吗Oracle PL/SQL如何输出FORALL语句中进行了多少次插入,oracle,plsql,bulkinsert,forall,Oracle,Plsql,Bulkinsert,Forall,获取和输出我下面的FORALL语句中插入了多少行的最佳方法是什么。我已经看到了SQL%BULK_行数,但我不确定在下面的语句中该如何工作 是吗 DBMS_OUTPUT.('rows inserted '||SQL%BULK_ROWCOUNT||''); 是否需要在另一个FORALL语句中加入上述内容?对于下面的代码,我将如何实现这一点 DECLARE TYPE t_arc_act_plus_trigger1 IS TABLE OF arc_act_plus_triggers1%ROWTYP
DBMS_OUTPUT.('rows inserted '||SQL%BULK_ROWCOUNT||'');
是否需要在另一个FORALL语句中加入上述内容?对于下面的代码,我将如何实现这一点
DECLARE
TYPE t_arc_act_plus_trigger1 IS TABLE OF arc_act_plus_triggers1%ROWTYPE;
v_arc_act_plus_triggers1 t_arc_act_plus_trigger1;
CURSOR c_arc_act_plus_triggers1 IS
SELECT /*+ PARALLEL */ apt.*
FROM act_plus_triggers1 apt
WHERE NOT EXISTS
(SELECT 1
FROM act_plus_triggers_copy1 aptc
WHERE aptc.surr_id = apt.surr_id)
AND apt.status IN ('EXT', 'EXP');
BEGIN
OPEN c_arc_act_plus_triggers1;
LOOP
FETCH c_arc_act_plus_triggers1 BULK COLLECT INTO v_arc_act_plus_triggers1 LIMIT 10000; -- limit to 10k to avoid out of memory
FORALL i IN 1..v_arc_act_plus_triggers1.COUNT
INSERT /*+ APPEND_VALUES */ INTO arc_act_plus_triggers1 values v_arc_act_plus_triggers1(i);
Com0932.get_parameter ('ACT_ARCHIVE_TRIGGER_STOP_YN',l_STOP_PROGRAM_YN);
IF l_STOP_PROGRAM_YN = 'Y' THEN
p_location('insert_into_arc_act_plus - STOP_PROGRAM_YN flag = '||l_STOP_PROGRAM_YN||' so ROLLBACK');
ROLLBACK;
EXIT;
END IF;
-- **************************************************
-- Output how many records have been inserted here???
-- **************************************************
-- commit after every 10000 records into arc_act_plus_triggers1
COMMIT;
EXIT WHEN c_arc_act_plus_triggers1%NOTFOUND;
END LOOP;
CLOSE c_arc_act_plus_triggers1;
END;
我还没有检查,因为我没有什么可测试的,所以请原谅任何“缺少分号类型错误”,我恐怕无法对此进行性能检查 您的代码似乎根据归档文件中不存在的行来选择要插入到归档表中的行。因此,只需使用基于由合适的ROWNUM值限制的SELECT的INSERT。一旦你提交,下一次在循环中,它就不会在你刚刚提交的时候尝试获取已经存档的行 我认为这应该是一样快,如果不是比膨胀的优势,它更简单的插入快速-奥卡姆斯剃须刀和所有的
DECLARE
l_commit_count NUMBER := 10000;
l_rows_copied NUMBER := 0;
BEGIN
DBMS_OUTPUT.PUT_LINE('Started at '||TO_DATE(SYSDATE, 'DD_MON_YYY HH24:MI:SS');
LOOP
INSERT /*+APPEND */
INTO c_arc_act_plus_triggers1
SELECT /*+ PARALLEL */ apt.*
FROM act_plus_triggers1 apt
WHERE NOT EXISTS
(SELECT 1
FROM act_plus_triggers_copy1 aptc
WHERE aptc.surr_id = apt.surr_id)
AND apt.status IN ('EXT', 'EXP')
AND rownum < l_commit_count;
COMMIT;
l_rows := l_rows + SQL%ROWCOUNT;
EXIT WHEN SQL%ROWCOUNT < 1;
END LOOP
DBMS_OUTPUT.PUT_LINE('Finished at '||TO_DATE(SYSDATE, 'DD_MON_YYY HH24:MI:SS');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(l_rows)||' rows copied to the archive table');
END;
我还没有检查,因为我没有什么可测试的,所以请原谅任何“缺少分号类型错误”,我恐怕无法对此进行性能检查 您的代码似乎根据归档文件中不存在的行来选择要插入到归档表中的行。因此,只需使用基于由合适的ROWNUM值限制的SELECT的INSERT。一旦你提交,下一次在循环中,它就不会在你刚刚提交的时候尝试获取已经存档的行 我认为这应该是一样快,如果不是比膨胀的优势,它更简单的插入快速-奥卡姆斯剃须刀和所有的
DECLARE
l_commit_count NUMBER := 10000;
l_rows_copied NUMBER := 0;
BEGIN
DBMS_OUTPUT.PUT_LINE('Started at '||TO_DATE(SYSDATE, 'DD_MON_YYY HH24:MI:SS');
LOOP
INSERT /*+APPEND */
INTO c_arc_act_plus_triggers1
SELECT /*+ PARALLEL */ apt.*
FROM act_plus_triggers1 apt
WHERE NOT EXISTS
(SELECT 1
FROM act_plus_triggers_copy1 aptc
WHERE aptc.surr_id = apt.surr_id)
AND apt.status IN ('EXT', 'EXP')
AND rownum < l_commit_count;
COMMIT;
l_rows := l_rows + SQL%ROWCOUNT;
EXIT WHEN SQL%ROWCOUNT < 1;
END LOOP
DBMS_OUTPUT.PUT_LINE('Finished at '||TO_DATE(SYSDATE, 'DD_MON_YYY HH24:MI:SS');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(l_rows)||' rows copied to the archive table');
END;
您是否尝试过SQL%ROWCOUNT?大概是v_arc_act_加上触发器1。计数?假设没有异常发生,等等。没有异常发生,因为它只是从一个表到存档表的直接副本,存档表是副本。不确定SQL%ROWCOUNT是否在FORALL语句中工作?或者它是一匹没有名字的马出于好奇,你为什么不直接插入。。。选择陈述这将比批量收集更有效。实际上,仔细想想,也许合并语句在这里最有效。您尝试过SQL%ROWCOUNT吗?大概是v_arc_act_加上触发器1。计数?假设没有异常发生,等等。没有异常发生,因为它只是从一个表到存档表的直接副本,存档表是副本。不确定SQL%ROWCOUNT是否在FORALL语句中工作?或者它是一匹没有名字的马出于好奇,你为什么不直接插入。。。选择陈述这将比批量收集更有效。事实上,仔细想想,也许合并语句在这里最有效。我试试上面的方法,然后回复你。我试试上面的方法,然后回复你