Для загрузки непротиворечивых данных из OLTP-базы данных выполните процедуру:
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;
Версия Оракул 12с. Индикатор поля row_seq - заполняется триггером для каждой таблицы. Для любой операции DML (вставка или обновление): new.row_seq = seq_rowseq.nextavl, где seq_rowseq — глобальная последовательность. Периодически (раз в 6-12 часов) возникает ошибка external key no parent. Это означает, что процедура вставила новые записи из дочерней таблицы и не вставила новые записи из родительской таблицы - я не знаю, как это происходит. Может ли быть сериализуемый уровень изоляции с немедленным исключением?