Oracle異常處理在PL/SQL語句書寫時,需要處理的異常-- 不做異常處理時DECLARE v_name emp.ename%TYPE; v_sal emp.sal%TYPE;BEGIN SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empn ...
Oracle異常處理
在PL/SQL語句書寫時,需要處理的異常
-- 不做異常處理時
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal
INTO v_name,v_sal
FROM emp
WHERE empno = &no;
IF v_sal <3000 THEN
DBMS_OUTPUT.PUT_LINE(v_name||'的工資是:'||v_sal);
END IF;
END;
在不做異常處理的時候,在輸入員工編號的值的時候,如果在資料庫中沒有,就會報錯
select * from emp;
--7369(empno) <3000(sal)
--7839 (empno) >3000
--Oracle的異常處理
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal
INTO v_name,v_sal
FROM emp
WHERE empno = &no;
IF v_sal <3000 THEN
DBMS_OUTPUT.PUT_LINE(v_name||'的工資是:'||v_sal);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('員工號輸入錯誤!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他錯誤!');
END;
--預定義異常處理
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE:=&salary;
BEGIN
SELECT ename INTO v_name FROM emp WHERE sal = v_sal;
DBMS_OUTPUT.put_line(v_name||'的工資是:'||v_sal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('沒有該工資的員工');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.put_line('多個員工具有該工資');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('其他異常');
END;
SELECT * FROM EMP;
--800(sal), 一個員工
--1250 多個員工
--8000 0個員工
--獲取異常的錯誤代碼和錯誤信息
BEGIN
DELETE FROM DEPT WHERE deptno = &deptno;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
END;
--非預定義異常的處理
DECLARE
--1:定義非預定義異常的標識符
e_fk EXCEPTION;
--2:將定義好的異常與Oracle錯誤建立關聯
-- -2292錯誤代碼
PRAGMA EXCEPTION_INIT(e_fk,-2292);
BEGIN
DELETE FROM DEPT WHERE deptno = &deptno;
EXCEPTION
--3:捕獲並處理異常
WHEN e_fk THEN
DBMS_OUTPUT.PUT_LINE('此部門下有員工,不能刪除此部門!');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
END;
--自定義異常
DECLARE
v_empno emp.empno%TYPE:=&empno;
--1:定義異常
e_no_result EXCEPTION;
BEGIN
UPDATE emp SET sal = sal + 100 WHERE empno = v_empno;
IF SQL%NOTFOUND THEN
--2:指定觸發異常的時機
RAISE e_no_result;
ELSE
COMMIT;
END IF;
EXCEPTION
--3:捕捉並處理異常
WHEN e_no_result THEN
DBMS_OUTPUT.put_line('數據更新失敗!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他錯誤');
END;
--異常處理函數SQLCODE和SQLERRM的使用
DECLARE
v_empno emp.empno%TYPE:= &empno;
v_ename emp.ename%TYPE:= '&ename';
v_deptno emp.deptno%TYPE:= &deptno;
BEGIN
INSERT INTO emp(empno,ename,deptno)VALUES(v_empno,v_ename,v_deptno);
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('數據插入成功!');
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('錯誤號:'||SQLCODE);
DBMS_OUTPUT.put_line('錯誤信息:'||SQLERRM);
END;