3) Во время работы PL/SQL-блока в другой сессии регулярно смотреть, до какого этапа дошла загрузка, запросом из лога:
select * from kk_events_log order by event_date desc, event_description desc;
Создадим процедуру kk_insert_kk_events_log:
create or replace procedure kk_insert_kk_events_log(in_event_date in date default sysdate,
in_event_description in varchar2) as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into kk_events_log
(event_date, event_description)
values
(in_event_date, in_event_description);
commit;
end kk_insert_kk_events_log;
Напишем требуемый PL/SQL-блок:
begin
-- 2.1
kk_insert_kk_events_log(in_event_description => 'Начата вставка данных об именах клиентов');
for i in 1 .. 50000 loop
insert into kk_clients_big_table
(client_name)
values
(dbms_random.string('a', 6));
end loop;
kk_insert_kk_events_log(in_event_description => 'Завершена вставка данных об именах клиентов');
-- 2.2
kk_insert_kk_events_log(in_event_description => 'Начат update данных о регионах клиентов');
for z in (select rowid rw from kk_clients_big_table) loop
update kk_clients_big_table
set region_name = dbms_random.string('p', 8)
where rowid = z.rw;
end loop;
kk_insert_kk_events_log(in_event_description => 'Завершен update данных о регионах клиентов');
-- 2.3
kk_insert_kk_events_log(in_event_description => 'Начат update данных о паспортах клиентов');
for z in (select rowid rw from kk_clients_big_table) loop
update kk_clients_big_table
set passport_ser_num = dbms_random.string('x', 10)
where rowid = z.rw;
end loop;
kk_insert_kk_events_log(in_event_description => 'Завершен update данных о паспортах клиентов');
--
commit;
end;
Согласно требованию задачи во время работы этого PL/SQL-блока в другой сессии будем регулярно смотреть, до какого этапа дошла загрузка, запросом:
select * from kk_events_log order by event_date desc, event_description desc;
Только в конце PL/SQL-блока выполняется commit, потому что, если загрузка упадет на каком-то этапе, то недогруженные данные нам не нужны. А до какого этапа дошла загрузка, можно понять из лога.
По завершении PL/SQL-блока посмотрим на загрузившиеся данные:
select * from kk_clients_big_table;
Отметим, что update-ы выполнялись медленнее, чем insert-ы. Если бы это были update-ы не по rowid и не по проиндексированным полям, то было бы еще медленнее.