转自: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后子方法是查不到父存储过程中未提交的数据的
相关推荐
自治事务可以是存储过程、函数、本地过程、打包过程、类型方法或顶层匿名块等形式。 自治事务的特点是,它与调用事务无关联,彼此独立。自治事务可以提交或回滚,而不影响调用事务的状态。同时,自治事务也可以共享...
在上面的示例中,我们使用 PRAGMA AUTONOMOUS_TRANSACTION 语句来声明自治事务,然后调用 Func_GenerateCode 函数来生成单据编号,并将其保存到数据库中。这样即使保存操作失败,自治事务也可以确保数据的一致性。 ...
要创建一个自主事务,可以在存储过程中使用`PRAGMA AUTONOMOUS_TRANSACTION`指令: ```sql PRAGMA AUTONOMOUS_TRANSACTION; ``` #### 2. 示例 下面是一个示例,展示了如何在一个存储过程中使用自主事务来插入数据并...
Oracle自治事务(Autonomous Transaction)机制可以解决这个问题,确保触发器和存储过程之间的事务独立性。 触发器调用存储过程的过程中可能会出现的问题是,insert语句不是自动提交的,因此当insert语句没有提交时...
要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。
`PRAGMA AUTONOMOUS_TRANSACTION`允许存储过程中执行非事务性操作,例如查询数据库快照。 **示例**:使用`PRAGMA AUTONOMOUS_TRANSACTION`。 ```sql CREATE OR REPLACE PROCEDURE check_data IS PRAGMA AUTONOMOUS...
Oracle数据库中的触发器是一种存储过程,它被设计为当特定事件发生时自动执行。这些事件包括数据修改操作,如INSERT、UPDATE或DELETE等。触发器可以确保数据的一致性和完整性,并帮助实现复杂的业务逻辑。 在某些...
在存储过程的开头添加`PRAGMA AUTONOMOUS_TRANSACTION`声明,使得`emp_p2`在自己的事务上下文中运行。这样,即使`emp_p2`中执行了回滚操作,也不会影响到外部的`emp_p1`事务。当再次调用`emp_p1`,输出结果表明`emp_...
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%...
为了声明一个存储过程或函数为自治事务,需要使用`Pragma Autonomous_Transaction`关键字。此声明意味着该存储过程中执行的操作将是独立的,不受外部事务状态的影响。例如: ```sql CREATE OR REPLACE PROCEDURE ...
综上所述,虽然在SELECT语句中调用DML函数看似违反了SQL语言的传统设计原则,但通过合理利用PL/SQL函数的特性,特别是在函数中使用`pragma autonomous_transaction`声明,可以使这种做法成为可能。这不仅拓展了SQL...
`PRAGMA AUTONOMOUS_TRANSACTION`使过程内的事务独立于调用它的主事务。 参数的数据类型可以是Oracle支持的各种标准类型,如`INTEGER`, `VARCHAR2`, `DATE`等,也可以是用户自定义的复合类型或表类型。 四、PL/SQL...
使用 `PRAGMA AUTONOMOUS_TRANSACTION` 可以使存储过程能够在自己的事务上下文中运行,不受调用者事务的影响。 ##### 5. 开发存储过程步骤 1. 定义存储过程的目标和功能。 2. 设计输入输出参数。 3. 编写存储过程...
- **PRAGMA AUTONOMOUS_TRANSACTION**:用于声明存储过程内的事务独立于调用它的事务,确保数据一致性。 6. **其他考虑**: - **错误处理**:包括异常处理块(如`BEGIN...EXCEPTION WHEN...END;`),以便在发生...
PRAGMA AUTONOMOUS_TRANSACTION; LANGUAGE_JAVA VARCHAR2(200) := 'OSAccess'; JAVA_METHOD VARCHAR2(200) := 'listDirectoryTree'; EXCEP EXCEPTION; PRAGMA EXCEPTION_INIT(EXCEP, -20000); BEGIN EXECUTE ...
触发器是Oracle数据库中一种特殊类型的存储过程,它能够自动地在特定的数据库事件(如数据插入、更新或删除等)发生时执行预定义的操作。触发器可以用来实现复杂的业务逻辑、数据一致性维护以及审计追踪等功能。 ##...
为了解决这个问题,我们可以使用`PRAGMA AUTONOMOUS_TRANSACTION`来创建一个独立的子事务,在这个子事务中执行读取操作。这样,读取和更新操作就在两个不同的事务中进行,避免了冲突。 修正后的触发器如下: ```...
Oracle提供`Wrap`命令来加密存储过程、函数、包等。例如: ```bash Wrap iname=script.sql ``` 这将创建一个加密的`.plb`文件,执行此文件可以创建加密的PL/SQL对象。 8. **不存在就插入、存在就更新** ...
- 使用`PRAGMA AUTONOMOUS_TRANSACTION`可以创建独立的事务,即使在异常处理中也能保持事务的完整性。 6. **最佳实践**: - 适当的错误处理:使用`EXCEPTION`块捕获并处理可能的错误。 - 性能优化:使用索引,...