ORACLE Использование SERIALIZABLE для PL / SQL для загрузки согласованных данных - PullRequest
0 голосов
/ 26 апреля 2020

Для загрузки согласованных данных из OLTP-базы данных сделайте pro c:

   procedure move_tables_to_mst_layer(v_sync sync_data) is
   pragma autonomous_transaction;
   v_src_table  varchar2(128);
   sql_stm      varchar2(30000);
   v_proc    varchar2(128);

begin

   execute immediate 'alter session SET ISOLATION_LEVEL = SERIALIZABLE';

   for rec in (select a_tbl_name as tblnm from a_tables
                where a_tbl_type in ('T0', 'T1')
                order by a_tbl_order
              )
   loop

       v_src_table := 'STG_'||rec.tblnm;
       sql_stm := 'insert /*+ append */ into '||v_src_table||' select t1.*
                    from '||rec.tblnm||' t1
                   where row_seq > '||v_sync.v_rowseq
                     ;
       --dbms_output.put_line(sql_stm);
       execute immediate sql_stm;
       --commit;
   end loop;

   commit;
   execute immediate 'alter session SET ISOLATION_LEVEL = READ COMMITTED';
exception
when others then
    errpck.raise_n_stop('SYNC', v_proc, 'Procedure move_tables_to_mst_layer');
end move_tables_to_mst_layer;

Версия Oracle 12 c. Поле индикатора row_seq - заполняется trgger для каждой таблицы. Для любой операции DML (вставка или обновление): new.row_seq = seq_rowseq.nextavl, где seq_rowseq - глобальная последовательность. Период c (один раз в 6-12 часов) возникает ошибка внешнего ключа без родителя. Это означает, что процедура вставила новые записи из дочерней таблицы и не вставила новые записи из родительской таблицы - я не знаю, как это происходит. Может быть использовать сериализуемый вариант немедленного исключения исключения изоляции?

...