最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle中的異常處理與自定義異常方式

 更新時間:2025年06月09日 09:33:42   作者:雷神樂樂  
這篇文章主要介紹了Oracle中的異常處理與自定義異常方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、什么是異常處理

程序因為數(shù)據(jù)的原因或者入?yún)⒌脑颍瑢?dǎo)致程序出錯,這個時候,為了面對這種不可避免的問題,程序塊里面添加了異常處理,當程序異常的時候,該怎么辦,可以在異常中定義。

二、異常的兩種分類

(1) 系統(tǒng)預(yù)定義:Oracle 自動拋出(如:'違反唯一性約束')

(2) 用戶自定義:編碼人員認為的 '非正常情況' ( v_exp1 EXCEPTION)

其中 '用戶自定義' 的異常在 pl/sql 環(huán)境使用,需 '顯式拋出'。

三、常見的預(yù)定義異常

異常名稱錯誤代碼說明
NO_DATA_FOUNDORA-01403查詢無結(jié)果
TOO_MANY_ROWSORA-01422查詢返回多行,而 INTO 只接收一行
DUP_VAL_ON_INDEXORA-00001違反唯一約束
ZERO_DIVIDEORA-01476除數(shù)為零
INVALID_NUMBERORA-01722字符串轉(zhuǎn)數(shù)字失敗
TIMEOUT_ON_RESOURCEORA-00051等待資源超時

四、異常處理語法

EXCEPTION
  WHEN [OTHERS] -- 異常場景
    THEN  -- 則做的事情

五、異常常用的三種方案

RAISE  異常拋出  --程序不接著往下執(zhí)行
NULL   忽略異常
ROLLBACK 異常回滾  --程序出現(xiàn)異常則回滾 程序的相關(guān)操作(UPDATE/INERT/DELETE)

捕捉異常的關(guān)鍵字是 SQLERRM 它能夠得到 異常的詳細信息

六、使用RAISE_APPLICATION_ERROR創(chuàng)建自定義錯誤碼

自定義異常參數(shù):使用RAISE_APPLICATION_ERROR拋出帶自定義錯誤碼和消息的異常。

開發(fā)者自定義的錯誤碼,范圍為-20000至-20999:

DECLARE
  v_salary NUMBER := 100000;
BEGIN
  IF v_salary > 50000 THEN
    RAISE_APPLICATION_ERROR(-20001, '工資超出上限'); -- 自定義錯誤碼
  END IF;
END;

七、異常練習(xí)

declare
  v_num          number := &input;
  exp_date_range exception; -- 異常定義
begin
  if v_num < 0 then
    raise exp_date_range; -- 異常拋出
  end if;
  dbms_output.put_line(v_num);
exception
  when exp_date_range then
    dbms_output.put_line('數(shù)據(jù)范圍不能為負數(shù)!');
end;

捕捉異常信息:

示例:將EMP表的數(shù)據(jù)同步到EMP表(把EMP表的數(shù)據(jù)重復(fù)兩遍)

create or replace procedure p_16 is
begin
  insert into emp
    select * from emp;
  commit;
exception
  when others then
    dbms_output.put_line(SQLERRM);
end;

BEGIN
  p_16;
end;

示例:入?yún)T工編號,打印對應(yīng)員工的姓名

程序出現(xiàn)異常之后,忽略使用null;當出現(xiàn)異常的時候,讓程序跳出執(zhí)行 彈出一個報錯的框 即拋出異常

create or replace procedure p_17(p_empno number) is
  v_name varchar2(10);
begin
  select ename into v_name from emp where empno = p_empno;
  dbms_output.put_line(v_name);
exception
  when others then
    dbms_output.put_line(SQLERRM);
    null;
    raise; -- 彈出窗口
    -- rollback;-- 也可以進行回滾
    -- 注意:raise語句會重新拋出當前異常,導(dǎo)致后續(xù)的 rollback; 永遠不會執(zhí)行
end;

BEGIN
  p_17(p_empno=>1111);
end;

程序出現(xiàn)異常,則回滾

下面是一個匿名 PL/SQL 塊:

DECLARE
  dept_no NUMBER(2) := 70;
BEGIN
  --開始事務(wù)
  INSERT INTO dept VALUES (70, '市場部', '北京'); --插入部門記錄
  INSERT INTO dept VALUES (70, '后勤部', '上海'); --插入相同編號的部門記錄        
  INSERT INTO emp --插入員工記錄
  VALUES
    (7997, '威爾', '銷售人員', NULL, TRUNC(SYSDATE), 5000, 300, 70);
  --提交事務(wù)
  COMMIT;

EXCEPTION
  WHEN OTHERS THEN
    --捕捉異常
    DBMS_OUTPUT.PUT_LINE(SQLERRM); --顯示異常消息
    ROLLBACK;                --回滾異常
END;

因為dept表的主鍵插入重復(fù),所以捕捉到異常,數(shù)據(jù)回滾,

插入emp表的語句在插入dept表之后,dept表未插入成功,emp表的語句不會跑,因此兩張表都插入失敗

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

隆尧县| 信宜市| 宜良县| 察雅县| 睢宁县| 仙居县| 衡东县| 东平县| 弋阳县| 汤阴县| 遂平县| 宾阳县| 新龙县| 芒康县| 白银市| 广州市| 普陀区| 沙湾县| 通许县| 文安县| 鹿泉市| 修文县| 临清市| 榆树市| 青海省| 通州区| 察雅县| 瓦房店市| 屯门区| 行唐县| 香港 | 黄骅市| 宕昌县| 连州市| 建湖县| 同仁县| 新民市| 伊川县| 长垣县| 巴中市| 湖口县|