`

存储过程中的pragma autonomous_transaction作用

 
阅读更多

 

转自:https://blog.csdn.net/pan_tian/article/details/7675800

 

这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSACTION

PRAGMA AUTONOMOUS_TRANSACTION中文翻译过来叫“自治事务”(翻译的还算好理解),对于定义成自治事务的Procedure,实际上相当于一段独立运行的程序段,这段程序不依赖于主程序,也不干涉主程序

自治事务的特点

第一,这段程序不依赖于原有Main程序,比如Main程序中有未提交的数据,那么在自治事务中是查找不到的。

第二,在自治事务中,commit或者rollback只会提交或回滚当前自治事务中的DML,不会影响到Main程序中的DML。

 

demo1

//无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;
/
exec parent_block
 
SELECT * FROM t;
//查询结果 
Parent block insert
Child block insert

//有pragma autonomous_transaction
修改在上面 CREATE OR REPLACE PROCEDURE child_block IS 后面添加 pragma autonomous_transaction
//查询结果
Child block insert

  可以看到没有添加pragma autonomous_transaction的话子存储过程中的commit会在父存储过程插入的数据一起提交

 

 

demo2

 

//方法无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
//结果 0 3 6

//方法有pragma autonomous_transaction
修改上面方法howmanyrows在begin前加上pragma autonomous_transaction
结果 0 1 6

可以看到添加了pragma autonomous_transaction后子方法是查不到父存储过程中未提交的数据的

 

 

分享到:
评论

相关推荐

    Oracle自治事务的介绍(Autonomous_Transactions)

    自治事务可以是存储过程、函数、本地过程、打包过程、类型方法或顶层匿名块等形式。 自治事务的特点是,它与调用事务无关联,彼此独立。自治事务可以提交或回滚,而不影响调用事务的状态。同时,自治事务也可以共享...

    Oracle数据完整性嵌套事务调用分析研究

    在上面的示例中,我们使用 PRAGMA AUTONOMOUS_TRANSACTION 语句来声明自治事务,然后调用 Func_GenerateCode 函数来生成单据编号,并将其保存到数据库中。这样即使保存操作失败,自治事务也可以确保数据的一致性。 ...

    存储过程和函数

    要创建一个自主事务,可以在存储过程中使用`PRAGMA AUTONOMOUS_TRANSACTION`指令: ```sql PRAGMA AUTONOMOUS_TRANSACTION; ``` #### 2. 示例 下面是一个示例,展示了如何在一个存储过程中使用自主事务来插入数据并...

    oracle触发器调用存储过程

    Oracle自治事务(Autonomous Transaction)机制可以解决这个问题,确保触发器和存储过程之间的事务独立性。 触发器调用存储过程的过程中可能会出现的问题是,insert语句不是自动提交的,因此当insert语句没有提交时...

    Oracle中怎样用自治事务保存日志表

    要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。

    oracle 存储过程学习

    `PRAGMA AUTONOMOUS_TRANSACTION`允许存储过程中执行非事务性操作,例如查询数据库快照。 **示例**:使用`PRAGMA AUTONOMOUS_TRANSACTION`。 ```sql CREATE OR REPLACE PROCEDURE check_data IS PRAGMA AUTONOMOUS...

    oracle自治事务(Trigger)

    Oracle数据库中的触发器是一种存储过程,它被设计为当特定事件发生时自动执行。这些事件包括数据修改操作,如INSERT、UPDATE或DELETE等。触发器可以确保数据的一致性和完整性,并帮助实现复杂的业务逻辑。 在某些...

    Oracle中独立事务的学习.docx

    在存储过程的开头添加`PRAGMA AUTONOMOUS_TRANSACTION`声明,使得`emp_p2`在自己的事务上下文中运行。这样,即使`emp_p2`中执行了回滚操作,也不会影响到外部的`emp_p1`事务。当再次调用`emp_p1`,输出结果表明`emp_...

    oracle批量删除数据

    PRAGMA AUTONOMOUS_TRANSACTION; n_delete NUMBER := 0; BEGIN WHILE 1 = 1 LOOP EXECUTE IMMEDIATE 'DELETE FROM ' || p_TableName || ' WHERE ' || p_Condition || ' AND ROWNUM USING p_Count; IF SQL%...

    oracle开发常用知识

    为了声明一个存储过程或函数为自治事务,需要使用`Pragma Autonomous_Transaction`关键字。此声明意味着该存储过程中执行的操作将是独立的,不受外部事务状态的影响。例如: ```sql CREATE OR REPLACE PROCEDURE ...

    在SELECT语句中调用DML函数

    综上所述,虽然在SELECT语句中调用DML函数看似违反了SQL语言的传统设计原则,但通过合理利用PL/SQL函数的特性,特别是在函数中使用`pragma autonomous_transaction`声明,可以使这种做法成为可能。这不仅拓展了SQL...

    ORACLE子程序及TABLE类型用法等[收集].pdf

    `PRAGMA AUTONOMOUS_TRANSACTION`使过程内的事务独立于调用它的主事务。 参数的数据类型可以是Oracle支持的各种标准类型,如`INTEGER`, `VARCHAR2`, `DATE`等,也可以是用户自定义的复合类型或表类型。 四、PL/SQL...

    oracle之把过程与函数说透

    使用 `PRAGMA AUTONOMOUS_TRANSACTION` 可以使存储过程能够在自己的事务上下文中运行,不受调用者事务的影响。 ##### 5. 开发存储过程步骤 1. 定义存储过程的目标和功能。 2. 设计输入输出参数。 3. 编写存储过程...

    Oracle存储过程开发规范与技巧

    - **PRAGMA AUTONOMOUS_TRANSACTION**:用于声明存储过程内的事务独立于调用它的事务,确保数据一致性。 6. **其他考虑**: - **错误处理**:包括异常处理块(如`BEGIN...EXCEPTION WHEN...END;`),以便在发生...

    如何从Oracle的存储过程中访问操作系统的资源.pdf

    PRAGMA AUTONOMOUS_TRANSACTION; LANGUAGE_JAVA VARCHAR2(200) := 'OSAccess'; JAVA_METHOD VARCHAR2(200) := 'listDirectoryTree'; EXCEP EXCEPTION; PRAGMA EXCEPTION_INIT(EXCEP, -20000); BEGIN EXECUTE ...

    oracle触发器

    触发器是Oracle数据库中一种特殊类型的存储过程,它能够自动地在特定的数据库事件(如数据插入、更新或删除等)发生时执行预定义的操作。触发器可以用来实现复杂的业务逻辑、数据一致性维护以及审计追踪等功能。 ##...

    Oracle触发器表发生了变化 触发器不能读它的解决方法(必看)

    为了解决这个问题,我们可以使用`PRAGMA AUTONOMOUS_TRANSACTION`来创建一个独立的子事务,在这个子事务中执行读取操作。这样,读取和更新操作就在两个不同的事务中进行,避免了冲突。 修正后的触发器如下: ```...

    oracle sql项目开发中常见问题总结

    Oracle提供`Wrap`命令来加密存储过程、函数、包等。例如: ```bash Wrap iname=script.sql ``` 这将创建一个加密的`.plb`文件,执行此文件可以创建加密的PL/SQL对象。 8. **不存在就插入、存在就更新** ...

    Oracle存储过程开发规范与技巧.docx

    - 使用`PRAGMA AUTONOMOUS_TRANSACTION`可以创建独立的事务,即使在异常处理中也能保持事务的完整性。 6. **最佳实践**: - 适当的错误处理:使用`EXCEPTION`块捕获并处理可能的错误。 - 性能优化:使用索引,...

Global site tag (gtag.js) - Google Analytics