Oracle存储过程的事务

1.Oracle事务不会自动提交。通常情况下,oralce将整个存储过程作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。

2.如果过程内部使用了commit命令或rollback命令,则存储过程就能够自行控制整个事务的结束时机,而不受整个会话的影响。

3.如果程序报异常,走到了exception里,则procedure会挂在那里,不会自动提交。

4.如果存储过程中有锁表(行)操作, 如不显式commit,则procedure会挂在那里,不会自动提交。锁表是同步操作,此时其他调用该procedure的只能等待。

5.procedure中 事务控制语句模版:

begin

   insert into ....
   commit;--提交
exception
    when others then 
        rollback;--当发生错误,回滚整个存储过程(rollback和commit是事务的同一级别,所以此处有rollback就ok了)

end;


6.框架中spring会自动给存储过程提交,这种行为并不是存储过程的行为。

eg.

create tabel test_lyh (a integer, b varchar2(30) not null);--建表语句

-------

例1:

create or replace procedure p_test_lyh( a integer, b varchar2)--参数不能带长度, b varchar2(10)是错的;默认是入参,in可省略,out要显式标注 如:b out integer;
 is--在过程和函数中没有使用关键词DECLARE,取而代之的是关键字IS或AS(declare用在匿名程序段中,声明变量)。

c varcha2(10);--变量在 is关键字后声明,需要带长度
begin
 update test_lyh t set t.a=6 where t.b=1;
      insert into test_lyh values(3, 3);
     insert into test_lyh values(4,null);
       exception
            when others then
                   dbms_output.put_line('error');
end p_test_lyh;

当单独执行上述存储过程,该存储过程会挂起(即未commit状态)。

在框架中调用此存储过程,结果:A       B

                                            ------------  

           3         3         (自动提交了)            

-----------

例2:

create or replace procedure p_test_lyh( a integer, b varchar2)--入参不能带长度, b varchar2(10)是错的。
 is

c varcha2(10);--变量在 is关键字后声明,需要带长度
begin
 update test_lyh t set t.a=6 where t.b=1;
      insert into test_lyh values(3, 3);

     insert into test_lyh values(4,null);
       exception
            when others then
                   dbms_output.put_line('error');

rollback;
end p_test_lyh;

当单独执行上述存储过程,存储过程会回滚到最初状态。表里无记录。框架调用此过程,效果一样。


7.备注:可以声明无参存储过程,如:

create or replace procedure p_test_lyh
 is

...
begin
 ...
end p_test_lyh;

但是无参存储过程不能带个空的括号,create or replace procedure p_test_lyh() 是错的。

调用的时候则可带可不带空的括号。



  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值