<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>
- 블록간 구분이 없어서 subprogram 에서 실행한 commit 이 main procedure 에 영향을 미치는 샘플 코드
#case one without using PRAGMA AUTONOMOUS_TRANSACTION
drop table t;
# hr 사용자 세션에서 실행
CREATE TABLE t (test_value VARCHAR2(25));
/
CREATE OR REPLACE PROCEDURE child_block IS
BEGIN
INSERT INTO t(test_value)
VALUES ('Child block insert');
COMMIT;
END child_block;
/
CREATE OR REPLACE PROCEDURE parent_block IS
BEGIN
INSERT INTO t(test_value)
VALUES('Parent block insert');
child_block; -- parent_block의 인서트까지 영향을 받는다.
ROLLBACK; -- child_block 에서 commit 를 실행해서 롤백될 것이 없다.
END parent_block;
/
-- run the parent procedure
execute parent_block;
-- check the results
#
SELECT * FROM t;
------------------------------------------------------------
TEST_VALUE
-------------------------
Parent block insert
Child block insert
# Parent block 에서 롤백을 했지만, 이미 커미트 처리되어 원하는 동작을 하지 않은것을 확인.
- 블록간 구분이 없어서 subprogram 에서 실행한 commit 이 main procedure 에 영향을 미치는 샘플 코드
--case 2 using PRAGMA AUTONOMOUS_TRANSACTION
--this mean the PROCEDURE child_block is independent
CREATE OR REPLACE PROCEDURE child_block IS
PRAGMA AUTONOMOUS_TRANSACTION; -- 새로운 옵션을 추가함.
BEGIN
INSERT INTO t(test_value)
VALUES('Child block insert');
COMMIT;--자신의 블럭에만 영향을 미치고, parent_block 블록에는 영향이 없음.
END child_block;
/
CREATE OR REPLACE PROCEDURE parent_block IS
BEGIN
INSERT INTO t(test_value)
VALUES('Parent block insert');
child_block;--자신의 인서트만 commit 처리됨.
ROLLBACK; --그래서 parent_block 의 인서트는 롤백 처리됨.
END parent_block;
/
-- empty the test table
TRUNCATE TABLE t;
-- run the parent procedure
exec parent_block;
-- check the results
SELECT * FROM t;
----------------------
TEST_VALUE
-------------------------
Child block insert
# 이전 샘플과 다르게 child_block 에서 인서트한 데이터만 입력된것을 확인.
- 특징 정리, 마지막의 주의 사항 조심할 것
- 패키지에서 사용 불가
'Database > PLSQL' 카테고리의 다른 글
069 - [Oracle PL/SQL] NOCOPY 예외상황 (0) | 2024.04.10 |
---|---|
068 - [Oracle PL/SQL] NOCOPY (0) | 2024.04.10 |
066 - [Oracle PL/SQL] Design - Definer's right, Invoker's rights (0) | 2024.04.09 |
065 - [Oracle PL/SQL] Design - Standardizing (0) | 2024.04.09 |
064 - [Oracle PL/SQL] Dynamic SQL - DBMS_SQL Package VS Execute immediate (0) | 2024.03.20 |