Autonomous Transactions
A brief overview of autonomous transactions.
oracle miscconfigurationintermediate
by OracleDba
21 views
A brief overview of autonomous transactions.
123456789101112131415161718
create table at_test (
id number not null,
description varchar2(50) not null
);
insert into at_test (id, description) values (1, 'Description for 1');
insert into at_test (id, description) values (2, 'Description for 2');
select * from at_test;
ID DESCRIPTION
---------- --------------------------------------------------
1 Description for 1
2 Description for 2
2 rows selected.
SQL>12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
declare
pragma autonomous_transaction;
begin
for i in 3 .. 10 loop
insert into at_test (id, description)
values (i, 'Description for ' || i);
end loop;
commit;
end;
/
PL/SQL procedure successfully completed.
select * from at_test;
ID DESCRIPTION
---------- --------------------------------------------------
1 Description for 1
2 Description for 2
3 Description for 3
4 Description for 4
5 Description for 5
6 Description for 6
7 Description for 7
8 Description for 8
9 Description for 9
10 Description for 10
10 rows selected.
SQL>
rollback;
select * from at_test;
ID DESCRIPTION
---------- --------------------------------------------------
3 Description for 3
4 Description for 4
5 Description for 5
6 Description for 6
7 Description for 7
8 Description for 8
9 Description for 9
10 Description for 10
8 rows selected.
SQL>
create table error_logs (
id number(10) not null,
log_timestamp timestamp not null,
error_message varchar2(4000),
constraint error_logs_pk primary key (id)
);
create sequence error_logs_seq;123456789101112131415161718192021222324252627282930313233343536373839404142
create or replace procedure log_errors (p_error_message in varchar2) as
pragma autonomous_transaction;
begin
insert into error_logs (id, log_timestamp, error_message)
values (error_logs_seq.nextval, systimestamp, p_error_message);
commit;
end;
/
begin
insert into at_test (id, description)
values (998, 'Description for 998');
-- Force invalid insert.
insert into at_test (id, description)
values (999, null);
exception
when others then
log_errors (p_error_message => sqlerrm);
rollback;
end;
/
PL/SQL procedure successfully completed.
select * from at_test where id >= 998;
no rows selected
select * from error_logs;
ID LOG_TIMESTAMP
---------- ---------------------------------------------------------------------------
ERROR_MESSAGE
----------------------------------------------------------------------------------------------------
1 28-FEB-2006 11:10:10.107625
ORA-01400: cannot insert NULL into ("TIM_HALL"."AT_TEST"."DESCRIPTION")
1 row selected.
SQL>Please to add comments
No comments yet. Be the first to comment!