異常處理與異常函式

skyin_1603發表於2016-11-12

在執行PLSQL程式的時候,有時候程式的執行過程中多多少少會遇到一些異常,
資料庫中已經編寫好各種各樣的異常程式碼與異常描述。當然我們根據實際的問題與情況,
還可以自己定義以下異常,定義異常,丟擲異常等環節來解決異常,從而能夠使程式順利執行。
以下是一些異常的使用,並定義了一些異常。

----異常處理:

---異常解決:

scott@PROD>set serveroutput on

scott@PROD>

scott@PROD>DECLARE

  2  v_deptno dept.deptno%TYPE := &deptno;

  3  v_dname  dept.dname%TYPE;

  4  v_str varchar2(50);

  5  BEGIN

  6  SELECT dname INTO v_dname FROM dept WHERE deptno = v_deptno;

  7  select decode(mod((40-length(v_dname))/2,2),0,lpad('*',(40-length(v_dname))/2,'*'),

  8  lpad('*',trunc((40-length(v_dname))/2),'*'))||v_dname||

  9  decode(mod((40-length(v_dname))/2,2),0,lpad('*',(40-length(v_dname))/2,'*'),

 10  lpad('*',trunc((40-length(v_dname))/2),'*')) into v_str from dual;

 11  dbms_output.put_line('****************************************');

 12  dbms_output.put_line(v_str);

 13  dbms_output.put_line('****************************************');

 14  EXCEPTION

 15  WHEN NO_DATA_FOUND THEN

 16  dbms_output.put_line('haha');

 17  WHEN TOO_MANY_ROWS THEN

 18  dbms_output.put_line('hehe');

 19  WHEN others THEN

 20    NULL;

 21  END;

 22  /

Enter value for deptno: 20

old   2: v_deptno dept.deptno%TYPE := &deptno;

new   2: v_deptno dept.deptno%TYPE := 20;

****************************************

****************RESEARCH****************

****************************************

PL/SQL procedure successfully completed.

 

scott@PROD>

#程式執行完成。
 

---使用異常函式:

hr@PROD>DECLARE

  2  v_deptno NUMBER := 500;

  3   v_name   VARCHAR2(20) := 'Testing';

  4  e_invalid_department EXCEPTION;

  5  BEGIN

  6   UPDATE departments

  7   SET department_name = v_name

  8  WHERE department_id = v_deptno;

  9  IF SQL % NOTFOUND THEN

 10  RAISE e_invalid_department;

 11  END IF;

 12  COMMIT;

 13  EXCEPTION

 14  WHEN e_invalid_department THEN

 15  DBMS_OUTPUT.PUT_LINE('No such department id.');

 16  END;

 17  /

No such department id.

PL/SQL procedure successfully completed.

#程式執行完成。雖然沒有deptno=500的記錄,但是由於使用的異常處理,這樣,更新過程中的異常不會影響真個程式的執行,當中的異常交由異常函式處理。

---使用異常函式自定義異常

hr@PROD>DECLARE

  2        v_deptno NUMBER := 270;

  3        v_name   VARCHAR2(20) := 'Testing';

  4      BEGIN

  5        UPDATE departments

  6        SET department_name = v_name

  7        WHERE department_id = v_deptno;

  8      IF SQL%FOUND THEN

  9        RAISE_APPLICATION_ERROR(-20001, 'Warning!');

 10      END IF;

 11      COMMIT;

 12      EXCEPTION

 13        WHEN OTHERS THEN

 14        DBMS_OUTPUT.PUT_LINE(SQLCODE);

 15        DBMS_OUTPUT.PUT_LINE(SQLERRM);

 16      ROLLBACK;

 17      END;

 18  /

-20001

ORA-20001: Warning!

PL/SQL procedure successfully completed.

#程式執行完成。因為部門表中是存在部門號為270的記錄,所以程式返回資訊。

以上程式中,雖然存在異常,但是透過自定義異常,然後把異常丟擲,讓程式順利執行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31392094/viewspace-2128351/,如需轉載,請註明出處,否則將追究法律責任。

相關文章