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

 

posted on 2018-08-27 22:20  EEEEEEEEEEEEEEEEEEE  阅读(258)  评论(0编辑  收藏  举报