PRAGMA AUTONOMOUS_TRANSACTION(자치 사무)
그 동안 프로그램에 분명히 기록이 삽입되었지만 뒤에 있는 Procedure에서 방금 삽입된 기록을 찾을 수 없었습니다. 마지막으로 이 Procedure의 정의에 PRAGMA AUTONOMOUS가 추가되었음을 발견했습니다.TRANSACTION.
PRAGMA AUTONOMOUS_TRANSACTION을 중국어로 번역하면'자치사무'(번역은 잘 이해한 편)이라고 한다. 자치사무로 정의된 Procedure는 사실상 독립적으로 실행되는 프로그램 단계에 해당한다. 이 프로그램은 메인 프로그램에 의존하지 않고 메인 프로그램에 간섭하지 않는다.
자치 사무의 특징
첫째, 이 프로그램은 기존의 Main 프로그램에 의존하지 않는다. 예를 들어 Main 프로그램에 제출하지 않은 데이터가 있으면 자치사무에서 찾을 수 없다.
둘째, 자치사무에서 commit이나 롤백은 현재 자치사무 중의 DML만 제출하거나 롤백할 뿐 Main 프로그램의 DML에 영향을 주지 않는다.
Autonomous Transaction Demo 1
Without Pragma Autonomous Transaction
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;
ROLLBACK;
END parent_block;
/
-- run the parent procedure
exec parent_block
-- check the results
SELECT * FROM t;
Output:
Parent block insert
Child block insert
With Pragma Autonomous Transaction
CREATE OR REPLACE PROCEDURE child_block IS
PRAGMA AUTONOMOUS_TRANSACTION;
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;
ROLLBACK;
END parent_block;
/
-- empty the test table
TRUNCATE TABLE t;
-- run the parent procedure
exec parent_block;
-- check the results
SELECT * FROM t;
Output:
Child block insert
Autonomous Transaction Demo 2
Without Pragma Autonomous Transaction
DROP TABLE t;
CREATE TABLE t (testcol NUMBER);
CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS
i INTEGER;
BEGIN
SELECT COUNT(*)
INTO i
FROM t;
RETURN i;
END howmanyrows;
/
CREATE OR REPLACE PROCEDURE testproc IS
a INTEGER;
b INTEGER;
c INTEGER;
BEGIN
SELECT COUNT(*)
INTO a
FROM t;
INSERT INTO t VALUES (1);
COMMIT;
INSERT INTO t VALUES (2);
INSERT INTO t VALUES (3);
b := howmanyrows;
INSERT INTO t VALUES (4);
INSERT INTO t VALUES (5);
INSERT INTO t VALUES (6);
COMMIT;
SELECT COUNT(*)
INTO c
FROM t;
dbms_output.put_line(a);
dbms_output.put_line(b);
dbms_output.put_line(c);
END testproc;
/
set serveroutput on
exec testproc
Output:
0
3
6
Total execution time 2.782 sec.
With Pragma Autonomous Transaction
CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS
i INTEGER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT COUNT(*)
INTO i
FROM t;
RETURN i;
END howmanyrows;
/
-- empty the test table
TRUNCATE TABLE t;
exec testproc;
Output:
0
1
6
전재는 출처를 밝혀 주십시오.http://blog.csdn.net/pan_tian/article/details/7675800
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.