`

存储过程中的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自治事务的介绍(Autonomous_Transactions)PRAGMA_AUTONOMOUS_TRANSACTION

    oracle自治事务(Trigger)

    在触发器中使用自制事务及调用存储过程 Declare Pragma Autonomous_Transaction; ...

    利用pragma data_seg实现程序只能单个实例运行

    利用pragma data_seg实现程序只能单个实例运行测试工程。已在VC 6.0环境下成功运行

    oracle 存储过程学习

    快速学习函数创建和练习。 创建函数、存储过程、创建过程、调用存储过程、AUTHID、PRAGMA AUTONOMOUS_TRANSACTION、开发存储过程步骤、删除过程和函数、过程与函数的比较

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

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

    SQLite 中文帮助pdf

    PRAGMA table_info('keys');--获取表的列信息 PRAGMA database_list; 对每个打开的数据库,使用该数据库的信息调用一次回叫函数。使用包括附加的数据库名和索引名在内的参数。第一行用于主数据库,第二行用于存放...

    #pragma用法_汇总.doc

    #pragma用法 汇总 doc 最近总有人问#pragma CODE SEG NEAR SEG NON BANKED 还有#pragma LINK INFO DERIVATIVE "mc9s12xs128"这些函数是什么意思 我在网上收集了一些资料希望能解大家疑惑 #pragma LINK ...

    #pragma_命令集合

    #pragma_命令集合 介绍pragma_命令的用法,使你不再迷茫

    pragma_comment用法

    pragma_comment用法,jian dan de jie shao.pragma_comment用法

    oracle生成动态前缀且自增号码的函数分享

    代码如下:create or replace Function GetInvitationNO...– 需要使用“Current_User”的权限防止无法运行“Execute Immediate”命令 & “PRAGMA AUTONOMOUS_TRANSACTION”自制事务防止DML无法DDL的问题 Totalprev V

    #pragma_命令集合.pdf

    #pragma_命令集合.pdf 不错的东西 很重要

    #Pragma_Pack.doc

    很详细的讲解 #Pragma_Pack的用法,作用,及效果,一目了然。

    IAR软件的使用说明

    IAR软件的操作使用说明,非常详细,哈哈哈哈哈

    #pragma使用详解 .pdf

    #pragma使用详解 .pdf #pragma使用详解 .pdf #pragma使用详解 .pdf

    dsp28335开发总结

    众所周知,微处理器从内存RAM中取指令的速度要比从flash中取指令要快好多倍,但是RAM的缺陷限制了其不能存储用户程序代码,因为RAM掉电会丢失数据,但是其速度要快,而flash内信息掉电不丢失,因此可以保存用户编程...

    Qt Sqlite加密数据库驱动源代码

    只不过对于加密数据库,需要在对数据库进行任何操作前,先执行“PRAGMA key=xxx;”。通过这种方式输入数据库密码。检验之前的密码是否正确可以在命令行中键入“.databases”,如果没有错误提示,那就是解密成功了;...

    Oracle中大批量删除数据的方法

    create or replace procedure delBigTab(p_TableName in varchar2,p_Condition in varchar2,p_Count in varchar2) as pragma autonomous_transaction; n_delete number:=0; begin while 1=1 loop ...

    解析#pragma指令

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或...

    SQLite PRAGMA

    SQLite PRAGMA SQLite 的 PRAGMA 命令是一个特殊的命令,可以用在 SQLite 环境内控制各种环境变量和状态标志。一个 PRAGMA 值可以被读取,也可以根据需求进行设置。 语法 要查询当前的 PRAGMA 值,只需要提供该 ...

    MFC 下获取键盘,鼠标的钩子程序

    #pragma data_seg("MySec") HWND g_hWnd=NULL; #pragma data_seg() #pragma comment(linker,"/section:MySec,RWS") /* SEGMENTS MySec READ WRITE SHARE */ #define WM_MSG WM_USER + 500 LRESULT CALLBACK ...

Global site tag (gtag.js) - Google Analytics