Oracle基础 存储过程和事务

一、事务和存储过程

  在存储过程中如何使用事务。当需要在存储过程中同时执行多条添加、修改、删除SQL语句时,为了保证数据完整性,我们需要使用事务。使用方式和在PL-SQL中非常相似,但也有一些区别。  

--带事务的存储过程
CREATE OR REPLACE PROCEDURE Account_zhuanzhang(fromuser NUMBER,touser NUMBER,money NUMBER) IS
BEGINUPDATE account SET balance = balance - money WHERE id = fromuser;UPDATE account SET balance = balance + money WHERE id = touser;COMMIT;
EXCEPTIONWHEN OTHERS THENdbms_output.put_line('转账失败');ROLLBACK;
END Account_zhuanzhang;

调用事务

SELECT * FROM ACCOUNT;
DECLARE fromuser NUMBER := 1;touser NUMBER := 2;money NUMBER := &m;
BEGINaccount_zhuanzhang(fromuser,touser,money);
END;

二、自主事务处理:

  自主事务:是由零一个事务启动的独立事务处理。自主事务处理可以暂停主事务处理,也就是处理自己存储过程内部的事务,当自主事务处理完之后会恢复主事务处理。

  PRAGMA AUTONOMOUS_TRANSACTION;  --定义为自主事务,不受其他事务提交,回滚的影响

  例:

--自主事务:带参数添加部门信息,最后使用了回滚
CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD(DEPTNO NUMBER,DNAME VARCHAR2,LOC VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION;  --定义为自主事务,不受其他事务提交,回滚影响
BEGININSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (DEPTNO, DNAME, LOC);ROLLBACK;  --自主事务回滚操作,不影响主事务。
END;

--主事务,添加部门信息,并调用带参数的自主事务,自己本身提交
CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD2 AS
BEGININSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (60, 'test1', 'test2');PRO_DEPT_ADD(70, 'test', 'test');     --如果调用的事务回滚,如果不是自主事务当前存储过程中插入数据也要一起回滚。但是添加了自主事务后,自主事务提交内容不会影响到当前存储过程COMMIT;
END;

调用主事务:

BEGINpro_dept_add2();  --调用完毕后,为60的部门插入成功,但是为70的部门信息回滚了。只有一条插入成功!
END;

  总结自主事务:

  1、自主事务处理结果的变化不依赖于主事务处理的状态或最终配置。

  2、自主事务处理提交或回滚时,不影响主事务处理的结果。

  3、自主事务提交一旦提交,该自主事务处理结果的变化对于其他事务处理就是课件的。这意味着,用于可以访问已更新的信息,无需等待主事务处理提交。

  4、自主事务处理可以启动其它自主事务处理。

分类: Oracle

标签: oracle

好文要顶 关注我 收藏该文  

Builder
关注 - 17
粉丝 - 51

+加关注

1

1

« 上一篇:Oracle基础 存储过程和游标
» 下一篇:Oracle基础 自定义函数

https://www.cnblogs.com/zhengcheng/p/4217531.html

存储过程中如何使用事务Transaction

 学习也休闲 2014-08-16 13:21:54

一、Begin Trans、Rollback Trans、Commit Trans方法

1、用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。

2、事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

二、存储过程中使用事务Transaction实例

Declare @id int
    BEGIN TRANSACTION
   
       Insert into xxxxxTable(f1,f2)values(@a,@b)
       Select @id=@@identity
        Insert into abcTable(ff1,ff2,ff3)values(@c,@id,@dd)

IF @@error <> 0 --发生错误
        BEGIN
            ROLLBACK TRANSACTION
            RETURN 0
        END
        ELSE
        BEGIN
            COMMIT TRANSACTION
            RETURN 1 --执行成功
       END

参考资料: 存储过程中使用事务Transaction http://www.studyofnet.com/news/551.html

存储过程 事务 Transaction

https://www.douban.com/note/395757588/

Oracle 存储过程 中如何使用事务Transaction 自主事务 自治事务相关推荐

  1. oracle存储过程ddl,Oracle 存储过程中的DDL语句

    Oracle的存储过程,是我们使用数据库应用开发的重要工具手段.在存储过程中,我们大部分应用场景都是使用DML语句进行数据增删改操作.本篇中,我们一起探讨一下数据定义语句DDL在存储过程中使用的细节和 ...

  2. java 创建临时表 oracle_在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  3. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  4. oracle存储过程日志打印,如何在oracle存储过程中逐行打印

    我正在执行一个存储过程,但它在某个时候失败了, 当前错误代码不帮我找到错误的位置和确切位置 我想知道它正在失败,所以想要在执行时逐行输出. 例如:如何在oracle存储过程中逐行打印 create o ...

  5. Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中:

    摘要:最近项目中用到了Oracle存储过程,所以就自己尝试着写了下,下面我把我遇到的问题描述一下:就是在我处理解析Clob字段中的xml字符串的时候,有个需求就是根据指定的主键参数,来判断该参数的值是 ...

  6. oracle存储过程中数组的使用

    oracle存储过程中数组的使用 create or replace package ArrayTestPKG1 is    type tt_type is table of varchar(32) ...

  7. 资源放送丨《Oracle存储过程中的性能瓶颈点》PPT视频

    前段时间,墨天轮分享了直播< SQL大赛冠军怀晓明:深入解析Oracle存储过程中的性能瓶颈点>,在这里我们共享一下PPT和视频,供大家参考学习. 在DBA日常工作中,经常会有这样的疑惑: ...

  8. oracle 存储过程中使用select 列 into 变量

    在oracle存储过程中,有许多自己定义的变量,一般是需要赋值的,在这种情况下,一般来说,可以使用 select 列 into 变量  from table ,就是将列赋值给变量.

  9. Oracle 存储过程中,解决变量使用 in条件时,查询无效问题

    oracle 存储过程中,定义变量之后,使用变量进行 in 条件查询时,会出现查询条件无效的问题 表结构 表数据 解决方法 create or replace type strsplit_type i ...

  10. oracle数据存储过程 中的循环 for 拼接字符串,oracle存储过程中使用字符串拼接

    1.使用拼接符号"||" v_sql := 'SELECT * FROM UserInfo WHERE ISDELETED = 0 AND ACCOUNT =''' || vAcc ...

最新文章

  1. ue4android相机拍照插件,cordova-plugin-camera相機插件使用
  2. 杨建:网站加速--内容简介
  3. Redis Cluster高可用(HA)集群环境搭建详细步骤
  4. KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
  5. php远程文件包含攻击,PHP “is_a()”函数远程文件包含漏洞
  6. python手机端秒杀_python实现淘宝秒杀脚本
  7. android自动化持续集成,基于持续集成的Android自动化测试.pdf
  8. python 收发邮件_python发送各类邮件的主要基本方法
  9. 解决:Whitelabel Error Page This application has no explicit mapping for /error...UnknownHostException
  10. java C# objective-c AES对称加解密
  11. 面向对象分析与设计阅读笔记一
  12. 在windows生产环境搭建sphinx的注意事项
  13. Android使用keytool-importkeypair生成系统签名
  14. linux怎么取消光盘,怎样取消ubuntu官方光盘
  15. Unity用代码将多张图片合并为一张图片
  16. C语言飞机大战小游戏(2万字!完整精讲解版+源代码)
  17. 实现自定义大转盘抽奖
  18. HIT2020春软件构造lab1
  19. Linux系统下安装Adobe Flash Player插件观播放视频
  20. Redis的集群配置

热门文章

  1. android java 数组_关于android:Java按月将数组排列成多个数组
  2. 浅谈C++的泛型编程以及模板
  3. 用python画四瓣树叶_如何用Python画树?
  4. 信息安全-OAuth2.0:NuGetFromMicrosoft
  5. oracle新建数据库schema-建立数据库、表空间和用户
  6. lvm android分区合并,Linux LVM 分区扩容与多磁盘分区合并处理
  7. Emoji 表情符号 处理
  8. tomcat java 热部署,tomcat热部署
  9. Least Mean Squares Regression(二)
  10. 【干货】减少外贸邮件进垃圾箱,找EmailCamel解决!