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; --回滚异常
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;
异常的处理格式
在plsql 块中格式 Declare 变量 Begin 代码块 EXCEPTION when 异常的名称 then 如生上面的异常时做的具体工作。 End;
常用异常处理:
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;