There is no 100% reliable way to map rows to transactions, unless you add custom columns.
Using ORA_ROWSCN, even with ROWDEPENDENCIES enabled, is not always accurate. Jack's test is correct, and shows that a single transaction will save all rows with the same SCN. However, it is also possible for a different transaction to create a row with the same SCN.
--Create a table with ROWDEPENDENCIES enabled.
drop table rowscn_test;
create table rowscn_test(a number) rowdependencies;
--Create 100 jobs to insert and commit one row.
begin
for i in 1 .. 100 loop
dbms_scheduler.create_job(
job_name => 'rowscn_'||i,
job_type => 'PLSQL_BLOCK',
job_action => 'begin insert into rowscn_test values(1); commit; end;',
enabled => true
);
end loop;
end;
/
--If ORA_ROWSCN was reliable then this query would not return any rows.
select ora_rowscn, count(*)
from rowscn_test
group by ora_rowscn
having count(*) > 1;
Sample results:
ORA_ROWSCN COUNT(*)
---------- --------
12124183417057 2
The results are not deterministic and will be different for each system. Sometimes the ORA_ROWSCNs are unique and the query returns no results. But I would not rely on that always being true.