PRAGMA AUTONOMOUS_TRANSACTION(자치 사무)

3863 단어
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

좋은 웹페이지 즐겨찾기