Oracle触发器和事务[通俗易懂]

Oracle触发器和事务[通俗易懂] oracle触发器和事务2015年11月24日14:16:43 it_taojingzhan 阅读数:320编写触发器时,需要注意以下几点:l        触发器不接受参数。l        一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。l        在一个表上的触发器越多,对在该表上的DML操作的性能影…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 

oracle触发器和事务

2015年11月24日 14:16:43 it_taojingzhan 阅读数:320

编写触发器时,需要注意以下几点:

l        触发器不接受参数。

l        一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。

l        在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。

l        触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。

l        在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)

l        触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。

l        在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。

l        在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能向表中的任何long和blob列。

l        不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。

 

关于“在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。” 这个可以区分一下,如果调用的过程中声明的是“自治事物”是可以调用的。

 

创建如下三张表,一个触发器和两个过程

[html] view plaincopy

  1. create table t_test(id int,tname varchar2(20));  
  2. create table t_test1(id int,tname varchar2(20));  
  3. create table t_test2(id int,tname varchar2(20));  
  4.   
  5. create or replace trigger tr_t_test  
  6.  after  insert  
  7.   on t_test  
  8.   FOR EACH ROW  
  9.   DECLARE  
  10.   i int;  
  11. begin  
  12.   i :=1;  
  13.   pro_t_test1(:NEW.id,:NEW.tname);  
  14.   
  15.   — pro_t_test2(:old.id,:old.tname);  
  16.   –rollback;  
  17. end;  
  18. /  
  19.   
  20. create or replace procedure pro_t_test1(vid int, vname varchar2)  
  21. is  
  22. Pragma Autonomous_transaction;  
  23. begin  
  24.   insert into t_test1 values(vid,vname);  
  25.   commit;  
  26. end;  
  27. /  
  28. create or replace procedure pro_t_test2(vid int, vname varchar2)  
  29. is  
  30. begin  
  31.    insert into t_test2 values(vid,vname);  
  32.    commit;  
  33. end;  
  34. /  

 

第一步触发器中的“

[html] view plaincopy

  1. — pro_t_test2(:old.id,:old.tname);  
  2. –rollback;  

”这两行是没有注释的掉。

虽然这个触发器可以创建成功,但是在insert操作的时候会报错ora-04092。

[html] view plaincopy

  1. SQL> insert into t_test values(1,’a’);  
  2.    
  3. insert into t_test values(1,’a’)  
  4.    
  5. ORA-04092: cannot COMMIT in a trigger  
  6. ORA-06512: at “YJQF.PRO_T_TEST2”, line 5  
  7. ORA-06512: at “YJQF.TR_T_TEST”, line 7  
  8. ORA-04088: error during execution of trigger ‘YJQF.TR_T_TEST’  
  9.    
  10. SQL> commit;  
  11.    
  12. Commit complete  
  13.    
  14. SQL> select count(*) from t_test;  
  15.    
  16.   COUNT(*)  
  17. ———-  
  18.          0  
  19.    
  20. SQL> select count(*) from t_test1;  
  21.    
  22.   COUNT(*)  
  23. ———-  
  24.          1  
  25.    
  26. SQL> select count(*) from t_test2;  
  27.    
  28.   COUNT(*)  
  29. ———-  
  30.          0  
  31.    
  32. SQL>   
  33. SQL> insert into t_test values(1,’a’);  
  34.    
  35. insert into t_test values(1,’a’)  
  36.    
  37. ORA-04092: cannot ROLLBACK in a trigger  
  38. ORA-06512: at “YJQF.TR_T_TEST”, line 8  
  39. ORA-04088: error during execution of trigger ‘YJQF.TR_T_TEST’  
  40.    
  41. SQL> commit;  
  42.    
  43. Commit complete  
  44.    
  45. SQL> select count(*) from t_test;  
  46.    
  47.   COUNT(*)  
  48. ———-  
  49.          0  
  50.    
  51. SQL> select count(*) from t_test1;  
  52.    
  53.   COUNT(*)  
  54. ———-  
  55.          2  
  56.    
  57. SQL> select count(*) from t_test2;  
  58.    
  59.   COUNT(*)  
  60. ———-  
  61.          0  
  62.    
  63. SQL>   

 

这两条insert虽然失败了,但是还是写到了t_test1表中了,在pro_t_test1上是有commit的,从这个可以看出“自主事物”是完全独立的。

在你的主事务中,你可以选择能够从其他事务中进行调用的独立事物。自治事务可以提交或回滚其修改而不影响调用它的主事务。

 

将这两行后注释掉后,插入就成功了。

 
SQL> insert into t_test values(1,’a’);
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select count(*) from t_test;
 
  COUNT(*)
———-
         1
 
SQL> select count(*) from t_test1;
 
  COUNT(*)
———-
         3
 
SQL> select count(*) from t_test2;
 
  COUNT(*)
———-
         0

 

https://blog.csdn.net/it_taojingzhan/article/details/50012161

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157728.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • img 转化成iso镜像的办法「建议收藏」

    img 转化成iso镜像的办法「建议收藏」最近在使用KVM启用虚拟机,然后将里面的环境和配置配置成我们公司需要的环境,再打包成iso镜像,之后再次生成新的虚拟机。但是KVM启动出的镜像生成的是img镜像,需要将img镜像转换成iso镜像

  • 【夏虫语冰】visio2013安装出错,您输入的产品密钥无法在此计算机上使用,错误25004[通俗易懂]

    【夏虫语冰】visio2013安装出错,您输入的产品密钥无法在此计算机上使用,错误25004[通俗易懂]问题的原因并不是您所下载的Office程序无法安装上去,而是所使用的密钥不能再授权安装和使用Office产品。如果在此电脑上之前已经安装并使用过了试用版本的Office的话,是不能重复不断地继续使用试用版本的Office和申请的授权密钥的。Office卸载工具有很多,下面介绍几个常见的工具:1、微软新版工具(未测试,微软官网无法下载)“SetupProd_OffScrub.exe”是微软新推出来Office卸载工具。下载链接&官方教程见下:从PC…

  • wptx64能卸载吗_电脑可以卸载bonjour软件吗?详细介绍bonjour软件

    wptx64能卸载吗_电脑可以卸载bonjour软件吗?详细介绍bonjour软件细心的用户发现电脑里面忽然多了一个叫bonjour的程序,以前都没有见过的,bonjour是什么?它是苹果电脑公司在其开发的操作系统MacOSX10.2版本之后引入的服务器搜索协议所使用的一个商标名。为什么电脑会多出bonjour软件?那么bonjour软件可以卸载吗?带着一系列疑问,我们一起阅读下文教程吧。bonjour是否可以卸载bonjour软件为什么会突然出现,那是因为你在电脑上安装了…

  • qtreewidget用法_qtreewidgetitem

    qtreewidget用法_qtreewidgetitemTreeWidget形成的树形控件是比较简单易用的,经过这段时间的使用,有了一些了解,特意总结下来,以供参考:1.隐藏表头2.添加元素3.为节点添加CheckBox4.添加右键菜单5.消息响应6.QTreeWidget提供了一些方法

  • 推荐几个bootstrap 后端UI框架

    推荐几个bootstrap 后端UI框架工欲善其事,必先利其器对于从事软件开发的您也一样,有一套熟悉的bootstrap后台ui框架,bootstrap后端模板让您的开发速度大幅度提升这是本人经常使用到的一些bootstrap后台框架推荐给大家第一名inspiniabootstrap后端模板演示地址http://cn.inspinia.cn效果图cn.inspinia.cn第二名nifty…

  • Visual Studio安装SVN插件[通俗易懂]

    Visual Studio安装SVN插件[通俗易懂]在VS上安装SVN插件后,感觉VS的代码版本控制用起来也这么顺手。

    2022年10月10日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号