Oracle 事务和异常处理

Posted 点点滴滴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 事务和异常处理相关的知识,希望对你有一定的参考价值。

Oracle 的异常和回滚

技术分享图片
DECLARE
   dept_no   NUMBER (2) := 70;
BEGIN
   --开始事务
   INSERT INTO dept 
        VALUES (dept_no, 市场部, 北京);               --插入部门记录
   INSERT INTO dept 
        VALUES (dept_no, 后勤部, 上海);               --插入相同编号的部门记录        
   INSERT INTO emp                                        --插入员工记录
        VALUES (7997, 威尔, 销售人员, NULL, TRUNC (SYSDATE), 5000,300, dept_no);
   --提交事务
   COMMIT;
EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN                            --捕足异常
     DBMS_OUTPUT.PUT_LINE(SQLERRM);                   --显示异常消息
     ROLLBACK;                                           --回滚异常
View Code

ollback会默认回滚所有事务,savepoint可以保存点,rollback可以回滚到前一个点,减少数据重复操作。

技术分享图片
DECLARE
   dept_no   NUMBER (2) :=90;
BEGIN
   --开始事务
   SAVEPOINT A;
   INSERT INTO dept 
        VALUES (dept_no, 市场部, 北京);               --插入部门记录
   SAVEPOINT B;   
   INSERT INTO emp                                        --插入员工记录
        VALUES (7997, 威尔, 销售人员, NULL, TRUNC (SYSDATE), 5000,300, dept_no);        
   SAVEPOINT C;                
   INSERT INTO dept 
        VALUES (dept_no, 后勤部, 上海);               --插入相同编号的部门记录
   --提交事务
   COMMIT;
EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN                            --捕足异常
     DBMS_OUTPUT.PUT_LINE(SQLERRM);                   --显示异常消息
     ROLLBACK TO B;                                      --回滚异常
END;
View Code

异常的处理格式

技术分享图片
在plsql 块中格式

Declare
  变量
Begin
    代码块
    
    EXCEPTION
        when 异常的名称  then
            如生上面的异常时做的具体工作。
End;
View Code

常用异常处理:

技术分享图片
set serveroutput on;
create or replace procedure pr12
as
--定义一个int变liang
v_age integer;
v_name varchar(30);
begin 
v_age:=89;
--通过select给v_name设置值
--修改成过程
select name into v_name from stud where id=1;
DBMS_OUTPUT.PUT_LINE(没有出错);
exception
 when value_error then 
 SYS.DBMS_OUTPUT.PUT_LINE(数值错误);
 when no_data_found then 
 SYS.DBMS_OUTPUT.PUT_LINE(没有数据);
 when others then
 SYS.DBMS_OUTPUT.PUT_LINE(sqlcode||你出错了||sqlerrm);
 end;

exec pr12();
-----------------------------------------
--自定义异常自己抛出异常/
/*
定义一个自己的异常
      myException Exception;
抛出异常
    RAISE myException;
    
    处理自己的异常:
        Exception 
            When myException then
                ....
*/
set serveroutput on;
declare
myEx exception;
begin
DBMS_OUTPUT.PUT_LINE(这里没错);
raise myEx;
DBMS_OUTPUT.PUT_LINE(不会输出,前面抛出异常);
--处理异常
exception
when myEx then
DBMS_OUTPUT.PUT_LINE(自己的异常||sqlcode||  ||sqlerrm);
when others then 
DBMS_OUTPUT.PUT_LINE(不知知道什么错误||sqlcode||sqlerrm);
END;
---出错直接抛出

declare
begin
DBMS_OUTPUT.PUT_LINE(no errors);
--直接抛出
RAISE_APPLICATION_ERROR(-20000, A);
DBMS_OUTPUT.PUT_LINE(go okk....);
exception
   when others then
DBMS_OUTPUT.PUT_LINE(sqlcode||  ||sqlerrm);
end;
View Code

 

以上是关于Oracle 事务和异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Oracle事务隔离级别处理差异

Spring 事务控制-存储过程事务

异常和TCP通讯

oracle存储过程报937错误

oracle断网后事务无法回滚

Oracle中事务怎么使用 ,啥时候使用事物