暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 全局临时表-通过数据库链接提交问题

askTom 2017-06-04
261

问题描述

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论