Как после выполнения операторов DML получить все затронутые записи?
Есть ли в PLS/QL команды/функции, которые после выполнения операторов DML перед commit могли бы показать записи с уже обновленными, добавленными или удаленными данными?
Примерно что-то такое:
create table t as
with cte as (
select 1 woid,'abc' words from dual union all
select 2 woid,'abc1' words from dual
) select * from cte;
--обновляем, добавляем или удаляем записи в таблице
update t
set words = 'qwe'
where <какое-то условие>;
select * from t where <какое-то условие>;
--после проверки коммит
commit;
Запросом перед commit можно, например, получить обновленные записи. Но как получить все затронутые записи после выполнения любых операторов DML? Ведь удалённые записи уже запросом не получить, а для добавленных - неизвестны их ID после вставки.
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Воспроизводимый и наглядный пример для реализации (db<>fiddle):
select * from t;
WOID WOR
---------- ---
1 abc
2 def
declare
type trows is table of t%rowtype;
rows trows;
totalrows trows := trows ();
rowcount int := 0;
begin
update t set words='qwe' where woid=1
returning woid, words bulk collect into rows;
rowcount := rowcount + sql%rowcount;
totalrows := totalrows multiset union rows;
delete from t where woid=2
returning woid, words bulk collect into rows;
rowcount := rowcount + sql%rowcount;
totalrows := totalrows multiset union rows;
dbms_output.put_line ('totalrows/rowcount='||totalrows.count||'/'||rowcount);
if (rowcount = totalrows.count) then
dbms_output.put_line ( -- любые проверки вместо вывода
'updated row(1)='||totalrows(1).words||chr(10)||
'deleted row(2)='||totalrows(2).words);
-- вернуть ок, вызывающий сделает commit
else
raise_application_error (-20000, 'error: totalrows not еqual rowcount');
end if;
end;
/
Вывод:
totalrows/rowcount=2/2
updated row(1)=qwe
deleted row(2)=def