Goal
----
Identify latest row in one Bulk SQL INSERT,
e.g. JDBC Update Batching, Batch Value is 1000,
or PL/SQL FORALL statement.
Case
----
One Bulk SQL insert 1000 rows, select from an Oracle external table,
De-duplicate by primary key, identify latest row in the file.
Constraint: All rows get same SCN or timestamp value if they are in one INSERT SQL.
Solution
-- -- ---
plain simple Oracle Sequence, for row update timestamp implementation.
drop table t purge;
create table t(id number, ts timestamp(6), seq number);
drop sequence s;
create sequence s;
declare
lt_id dbms_sql.number_table;
begin
select rownum bulk collect into lt_id
from dual
connect by level <= 10;
forall i in 1..lt_id.count
insert into t(id, ts)
values(lt_id(i), systimestamp);
commit;
end;
/
select id, ts from t;
--
-- With update_change_sequence
declare
lt_id dbms_sql.number_table;
begin
select rownum bulk collect into lt_id
from dual
connect by level <= 10;
forall i in 1..lt_id.count
insert into t(id, ts, seq)
values(lt_id(i), systimestamp, s.nextval );
commit;
end;
/
select id, seq, ts from t;
No comments:
Post a Comment