轉載:學習筆記:oracle異常處理

16-1:傳遞異常到調用環境

DECLARE
   v_ename emp.ename%TYPE;
BEGIN
   SELECT ename INTO v_ename FROM emp WHERE empno=&no;
   dbms_output.put_line('僱員名:'||v_ename);
END;
/
16-2:捕獲異常
DECLARE
   v_ename emp.ename%TYPE;
BEGIN
   SELECT ename INTO v_ename FROM emp WHERE empno=&no;
   dbms_output.put_line('僱員名:'||v_ename);
EXCEPTION
   WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('僱員號不正確,請覈實僱員號!');
END;
/
16-3:使用預定義異常
DECLARE
   v_ename emp.ename%TYPE;
BEGIN
   SELECT ename INTO v_ename FROM emp WHERE sal=&salary;
   dbms_output.put_line('姓名:'||v_ename);
EXCEPTION
   WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('不存在該工資值的僱員');
   WHEN TOO_MANY_ROWS THEN
     dbms_output.put_line('多個僱員具有該工資');
END;
/
16-4:非預定義異常
DECLARE
   e_integrity EXCEPTION;
   PRAGMA EXCEPTION_INIT(e_integrity,-2291);
   name emp.ename%TYPE:=LOWER('&name');
   dno emp.deptno%TYPE:=&dno;
BEGIN
   UPDATE emp SET deptno=dno WHERE LOWER(ename)=name;
EXCEPTION
   WHEN e_integrity THEN
     dbms_output.put_line('該部門不存在');
END;
/
16-5:自定義異常
DECLARE
   e_integrity EXCEPTION;
   e_no_rows EXCEPTION;
   PRAGMA EXCEPTION_INIT(e_integrity,-2291);
   name emp.ename%TYPE:=LOWER('&name');
   dno emp.deptno%TYPE:=&dno;
BEGIN
   UPDATE emp SET deptno=dno WHERE LOWER(ename)=name;
   IF SQL%NOTFOUND THEN
      RAISE e_no_rows;
   END IF;
EXCEPTION
   WHEN e_integrity THEN
     dbms_output.put_line('該部門不存在');
   WHEN e_no_rows THEN
     dbms_output.put_line('該僱員不存在');
END;
/
16-6:使用sqlcode和sqlerrm
BEGIN
   DELETE FROM dept WHERE deptno=&dno;
EXCEPTION
   WHEN OTHERS THEN
     dbms_output.put_line('錯誤號:'||SQLCODE);
     dbms_output.put_line('錯誤消息:'||SQLERRM);
END;
/
16-7:raise_application_error
CREATE OR REPLACE PROCEDURE update_sal
   (name VARCHAR2,salary NUMBER)
IS
BEGIN
   UPDATE emp SET sal=salary WHERE LOWER(ename)=LOWER(name);
   IF SQL%NOTFOUND THEN
      RAISE_APPLICATION_ERROR(-20000,'該僱員不存在');
   END IF;
END;
/
exec update_sal('mary',1000)
16-8:不使用編譯預警
CREATE OR REPLACE PROCEDURE dead_code AS
BEGIN
   IF TRUE THEN
     dbms_output.put_line('TRUE');
   ELSE
     dbms_output.put_line('FALSE'); -- 死代碼
   END IF;
END;
/
16-9:使用初始化參數plsql_warnings配置編譯警告
ALTER SESSION SET plsql_warnings='ENABLE:ALL';
CREATE OR REPLACE PROCEDURE dead_code AS
BEGIN
   IF TRUE THEN
     dbms_output.put_line('TRUE');
   ELSE
     dbms_output.put_line('FALSE'); -- 死代碼
   END IF;
END;
/
show errors
16-10:使用包dbms_warning配置編譯警告
exec dbms_warning.set_warning_setting_string('ENABLE:ALL' ,'SESSION');
CREATE OR REPLACE PROCEDURE update_sal
(name VARCHAR2,salary VARCHAR2)
IS
BEGIN
   UPDATE emp SET sal=salary WHERE ename=name;
END;
/
show errors

發佈了27 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章