Для загрузки согласованных данных из 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 часов) возникает ошибка внешнего ключа без родителя. Это означает, что процедура вставила новые записи из дочерней таблицы и не вставила новые записи из родительской таблицы - я не знаю, как это происходит. Может быть использовать сериализуемый вариант немедленного исключения исключения изоляции?