问题描述
Below SQL gives 696 rows which I am processing in BULK collect 300
SELECT ROWID FROM TB_EMPLOYEE_TEST WHERE DT <= TO_DATE('01/01/2008', 'MM/DD/YYYY');
Global temporary table is created with ON COMMIT DELETE ROWS; still data in global table is not getting deleted after commit.
I have shared below two blocks with PUT_LINE output.
Can you please help to understand why Global temp table is not getting flushed here when COMMIT;
create or replace TYPE "TAB_ARRAY" is table of varchar2(4000);
/
CREATE GLOBAL TEMPORARY TABLE tb_global_temp
( "ROW_ID" VARCHAR2(50 BYTE)
) ON COMMIT DELETE ROWS
/
This is with COMMIT option..
set SERVEROUTPUT ON;
declare
TYPE r_cursor IS REF CURSOR;
c_cur_var r_cursor;
n_count number;
tb_arr_tab_id TAB_ARRAY;
begin
OPEN c_cur_var FOR SELECT ROWID FROM TB_EMPLOYEE_TEST WHERE DT <= TO_DATE('01/01/2008', 'MM/DD/YYYY');
LOOP
FETCH c_cur_var BULK COLLECT INTO tb_arr_tab_id LIMIT 300;
EXIT WHEN tb_arr_tab_id.COUNT = 0;
FORALL i IN tb_arr_tab_id.FIRST .. tb_arr_tab_id.LAST
INSERT INTO tb_global_temp VALUES (tb_arr_tab_id(i));
DBMS_OUTPUT.PUT_LINE('1....tb_arr_tab_id.COUNT>>>>'||tb_arr_tab_id.COUNT);
insert into TB_EMPLOYEE_TEST_1@db
SELECT * FROM TB_EMPLOYEE_TEST WHERE ROWID IN (SELECT ROW_ID from tb_global_temp);
DBMS_OUTPUT.PUT_LINE('ROWCOUNT>>>>'||SQL%ROWCOUNT);
--execute immediate 'truncate table tb_global_temp';
commit;
tb_arr_tab_id.DELETE;
end loop;
exception when others then
rollback;
DBMS_OUTPUT.PUT_LINE('OTHERS>>>>'||SQLERRM);
END;
-----------------------------------------------------------------------
1....tb_arr_tab_id.COUNT>>>>300
ROWCOUNT>>>>300
1....tb_arr_tab_id.COUNT>>>>300
ROWCOUNT>>>>600
1....tb_arr_tab_id.COUNT>>>>96
ROWCOUNT>>>>696
-----------------------------------------------------------------------
--########################################################################--
But when used TRUNCATE Global table is getting flushed in 2nd iteration
set SERVEROUTPUT ON;
declare
TYPE r_cursor IS REF CURSOR;
c_cur_var r_cursor;
n_count number;
tb_arr_tab_id TAB_ARRAY;
begin
OPEN c_cur_var FOR SELECT ROWID FROM TB_EMPLOYEE_TEST WHERE DT <= TO_DATE('01/01/2008', 'MM/DD/YYYY');
LOOP
FETCH c_cur_var BULK COLLECT INTO tb_arr_tab_id LIMIT 300;
EXIT WHEN tb_arr_tab_id.COUNT = 0;
FORALL i IN tb_arr_tab_id.FIRST .. tb_arr_tab_id.LAST
INSERT INTO tb_global_temp VALUES (tb_arr_tab_id(i));
DBMS_OUTPUT.PUT_LINE('1....tb_arr_tab_id.COUNT>>>>'||tb_arr_tab_id.COUNT);
insert into TB_EMPLOYEE_TEST_1@db
SELECT * FROM TB_EMPLOYEE_TEST WHERE ROWID IN (SELECT ROW_ID from tb_global_temp);
DBMS_OUTPUT.PUT_LINE('ROWCOUNT>>>>'||SQL%ROWCOUNT);
execute immediate 'truncate table tb_global_temp';
--commit;
tb_arr_tab_id.DELETE;
end loop;
exception when others then
rollback;
DBMS_OUTPUT.PUT_LINE('OTHERS>>>>'||SQLERRM);
END;
-----------------------------------------------------------------------
1....tb_arr_tab_id.COUNT>>>>300
ROWCOUNT>>>>300
1....tb_arr_tab_id.COUNT>>>>300
ROWCOUNT>>>>300
1....tb_arr_tab_id.COUNT>>>>96
ROWCOUNT>>>>96 专家解答
这是因为您正在通过数据库链接插入行。如MOS note 2254676.1中所述,临时表不支持分布式事务。
您需要手动删除行或像您所做的那样截断。
您需要手动删除行或像您所做的那样截断。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




