1. sqlplus에서는 select문을 제외한 쿼리를 날린 다음 commit을 하지 않고 exit하면 자동으로 commit된다.
2. procedure내에서 여러개의 쿼리중 하나만이라도 오류가 생기면 모두 rollback된다.
3. procedure내에서 명시적으로 commit을 하지 않으면, 어플리케이션 차원이나,
sqlplus의 세션종료시에 commit, rollback여부가 결정된다.
즉. procedure도 procedure내에서 명시적으로 commit하지 않으면 서로 다른 세션에서는 결과 값이 다르다.
commit을 명시하는 것이 옳다
[예제]
create table test1
(id number not null
,name varchar2(10));
create table test2
(id number not null
,name varchar2(10));
CREATE OR REPLACE procedure myProc
(v_name in test1.name%type)
is
v_id test1.id%type;
begin
select nvl(max(id), 0) into v_id from test1;
insert into test1 values (v_id + 1, v_name || '1');
insert into test2 values (v_id + 1, v_name || '2');
commit;
exception
when others then
rollback;
insert into test1 values (v_id + 1, '에러발생');
insert into test2 values (v_id + 1, '에러발생');
commit;
--raise_application_error(SQLCODE,SQLERRM,true);
--DBMS_OUTPUT.PUT_LINE('SQL CODE : ' || SQLCODE);
--DBMS_OUTPUT.PUT_LINE('Error Msg : ' || SQLERRM);
end;
/
exec myProc('tesdfsdfgsdfgst');
오라클의 프로시져(Procedure) 트랜젝션 특성2 : https://blog.daonelab.com/post/24/413/