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