Search notes:

Oracle: ALTER SESSION DISABLE COMMIT IN PROCEDURE

After executing alter sesion dsiable commit in procedure, a PL/SQL procedure cannot end a transaction with either commit or rollback.
create table tq84_tab_commit_test (
   val number
);
Github repository Oracle-Patterns, path: /SQL/alter/session/commit-in-procedure/tab.sql
create or replace package tq84_pkg_commit_test as

    procedure do_something(val number);

end tq84_pkg_commit_test;
/

create or replace package body tq84_pkg_commit_test as

    procedure do_something(val number) is
    begin

        if val = -1 then
           commit;
           return;
        end if;

        if val = -2 then
           rollback;
           return;
        end if;

        insert into tq84_tab_commit_test values (val);

    end do_something;

end tq84_pkg_commit_test;
/
show errors
Github repository Oracle-Patterns, path: /SQL/alter/session/commit-in-procedure/pkg.sql
--
--    Default:
--
alter session enable commit in procedure;

begin
   tq84_pkg_commit_test.do_something( 1);
   tq84_pkg_commit_test.do_something( 2);
   tq84_pkg_commit_test.do_something( 3);
   tq84_pkg_commit_test.do_something(-1); -- commit
   tq84_pkg_commit_test.do_something( 4);
   tq84_pkg_commit_test.do_something( 5);
   tq84_pkg_commit_test.do_something(-2); -- rollback
end;
/

select * from tq84_tab_commit_test;

alter session disable commit in procedure;


--
-- Following block throws
--    ORA-00034: cannot COMMIT in current PL/SQL session
--
begin
   tq84_pkg_commit_test.do_something( 1);
   tq84_pkg_commit_test.do_something( 2);
   tq84_pkg_commit_test.do_something( 3);
   tq84_pkg_commit_test.do_something(-1); -- commit
end;
/

select * from tq84_tab_commit_test;
Github repository Oracle-Patterns, path: /SQL/alter/session/commit-in-procedure/exec.sql

Index