Вы говорите в рамках транзакции или вне ее?
В нашей программе мы можем использовать такие вещи, как SQL% ROWCOUNT, чтобы увидеть, удалось ли нашему DML ...
SQL> set serveroutput on size unlimited
SQL> begin
2 update emp
3 set job = 'SALESMAN', COMM=10
4 where empno = 8083;
5 dbms_output.put_line('Number of records updated = '||sql%rowcount);
6 end;
7 /
Number of records updated = 1
PL/SQL procedure successfully completed.
SQL>
В качестве альтернативы мы можем проверить на наличие SQL% FOUND (или SQL% NOTFOUND).
За пределами транзакции мы можем отслеживать ORA_ROWSCN, чтобы увидеть, изменилась ли запись.
SQL> select ora_rowscn from emp
2 where empno = 8083
3 /
ORA_ROWSCN
----------
83828715
SQL> update emp
2 set comm = 25
3 where empno = 8083
4 /
1 row updated.
SQL> commit
2 /
Commit complete.
SQL> select ora_rowscn from emp
2 where empno = 8083
3 /
ORA_ROWSCN
----------
83828780
SQL>
По умолчанию ORA_ROWSCN устанавливается на уровне блока. Если вы хотите отслеживать его на нижнем уровне, вам нужно создать таблицу с ключевым словом ROWDEPENCIES.
Это специальные решения. Если вы хотите превентивного мониторинга, то вам нужно реализовать какую-либо форму ведения журнала. Использование триггеров для записи записей журнала является распространенным решением. Если у вас есть Enterprise Edition, вы должны рассмотреть возможность использования Fine Grained Auditing: в библиотеке Дэна Моргана есть полезная демонстрация того, как использовать FGA для отслеживания изменений .