1. 程式人生 > >Oracle 事務和異常處理

Oracle 事務和異常處理

回滾 設置 插入 insert set others point exe str

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 事務和異常處理