есть таблица - SCD type 2 (
http://en.wikipedia.org/wiki/Slowly_changing_dimension) вида
create table Agrs_table
(
agreement_ID Number,
start_date Date,
end_date Date,
...прочие поля
)
с заполнением в несколько шагов:
1) сначала в таблицу вставляются новые записи
2) затем у всех затронутых изменением записей меняется end_date
заполнение End_Date "бесконечной датой" производится таким кодом:
procedure EndDate
is
var_agreement_ID dbms_sql.Number_Table;
var_start_date dbms_sql.Date_Table;
var_end_date dbms_sql.Date_Table;
var_cursor ref cursor;
var_rowcount int;
begin
open var_cursor for
select agreement_ID,
start_date,
lead(start_date - 1, 1, date '2100-12-31') over(partition by agreement_ID order by start_date) as end_date
from (select distinct agreement_ID, start_date
from Agrs_table)
order by agreement_ID;
loop
fetch var_cursor bulk collect
into var_agreement_ID, var_start_date, var_end_date limit 50000;
exit when var_agreement_ID.first is null;
forall i in var_agreement_ID.first .. var_agreement_ID.last
update Agrs_table
set end_date = var_end_date(i)
where agreement_ID = var_agreement_ID(i)
and start_date = var_start_date(i)
and end_date != var_end_date(i);
end loop;
close var_cursor;
end;
есть ли вы более эффективное решение?
например, это
http://www.business-intelligence-quotient.com/?p=66. лучше уже тем, что производится один скан участвующих таблиц и одно изменение в них в разрезе затронутых строк одновременно, а не 2 раза подряд?