PL/SQL基礎-異常處理

來源:互聯網
上載者:User

PL/SQL基礎-異常處理

異常處理
一、異常的類型
Oracle異常分為兩種類型:系統異常、自訂異常。
 其中系統異常又分為:預定義異常和非預定義異常。
1.預定義異常
ORACLE定義了他們的錯誤編號和異常名字,常見的預定義異常處理Oracle常見的錯誤

NO_DATA_FOUND SELECT ... INTO ... 時,沒有找到資料
DUL_VAL_ON_INDEX 試圖在一個有惟一性約束的列上儲存重複值
CURSOR_ALREADY_OPEN 試圖開啟一個已經開啟的遊標
TOO_MANY_ROWS SELECT ... INTO ... 時,查詢的結果是多值
ZERO_DIVIDE 零被整除
2.非預定義異常
ORACLE為它定義了錯誤編號,但沒有定義異常名字。我們使用的時候,先聲名一個異常名,
 通過偽過程PRAGMA EXCEPTION_INIT,將異常名與錯誤號碼關聯起來。

3.自訂異常
 程式員從我們業務角度出發,制定的一些規則和限制。
二、異常處理
PL/SQL中,異常處理按個步驟進行:
 定義異常
 拋出異常
 捕獲及處理異常

a.定義異常

exception_name EXCEPTION;

b.拋出異常

RAISE exception_name

c.捕獲及處理異常

EXCEPTION
WHEN e_name1 [OR e_name2 ... ] THEN
statements;
WHEN e_name3 [OR e_name4 ... ] THEN
statements;
......
WHEN OTHERS THEN
statements;
END;

--使用預定義的異常
--根據用記輸入的商品ID來查商品庫存

DECLARE
V_ID ES_PRODUCT.ID%TYPE := &V_ID; --使用者輸入商品ID
V_STOCKCOUNT ES_PRODUCT.STOCKCOUNT%TYPE; ---庫存量
BEGIN
SELECT STOCKCOUNT INTO V_STOCKCOUNT FROM ES_PRODUCT WHERE ID = V_ID;
DBMS_OUTPUT.PUT_LINE('庫存量:' || V_STOCKCOUNT);
--判斷庫存量是否正常
IF V_STOCKCOUNT > 0 THEN
--更新庫存,一次買一個減掉一個
UPDATE ES_PRODUCT
SET STOCKCOUNT = STOCKCOUNT - 1
--更新指定的,不然會全部更新
WHERE ID = V_ID;
--提出資料操作
COMMIT;
DBMS_OUTPUT.PUT_LINE('庫存更新成功');
ELSIF V_STOCKCOUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE('庫存量是0,沒有庫存了');
ELSE
DBMS_OUTPUT.PUT_LINE('庫存異常');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('該商品不存在!');
ROLLBACK;
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('該商品存在多個!');
ROLLBACK;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('發生了其它錯誤!');
ROLLBACK;
END;

 


--自訂異常
--實現訂單刪除

 

SELECT * FROM ES_ORDER;
DECLARE
E_NO_RESULT EXCEPTION;
V_ID ES_ORDER.ID%TYPE := &ID;
V_EXCEPTION1 CONSTANT VARCHAR2(50) := '刪除資料不成功!';
V_EXCEPTION2 CONSTANT VARCHAR2(50) := '發生了錯誤!';
BEGIN
DELETE FROM ES_ORDER WHERE ID = V_ID;
IF (SQL%NOTFOUND) THEN
--刪除沒有執行
RAISE E_NO_RESULT;
END IF;
EXCEPTION
WHEN E_NO_RESULT THEN
DBMS_OUTPUT.PUT_LINE(V_EXCEPTION1);
ROLLBACK;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(V_EXCEPTION2);
ROLLBACK;
END;

--------------------------------------分割線 --------------------------------------

rlwrap - 解決Linux下SQLPLUS退格、上翻鍵亂碼問題

SQLPLUS spool 到動態記錄檔名

Oracle SQLPLUS提示符設定

通過設定SQLPLUS ARRAYSIZE(行預取)加快SQL返回速度

PL/SQL Developer實用技巧分享

--------------------------------------分割線 --------------------------------------

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.