系统自带异常
DECLARE
v_ename varchar2(10);
v_empno number(4) := &v_empno;
BEGIN
SELECT ename
INTO v_ename
FROM EMP
WHERE empno = v_empno;
DBMS_OUTPUT.PUT_LINE('Employee name is '||v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('There is no such employee');
END;
其他自带异常
TOO_MANY_ROWS : SELECT INTO返回多行
INVALID_CURSOR :非法指针操作(关闭已经关闭的游标)
ZERO_DIVIDE :除数等于零
DUP_VAL_ON_INDEX :违反唯一性约束
ACCESS_INTO_NULL: 未定义对象
CASE_NOT_FOUND: CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时
COLLECTION_IS_NULL: 集合元素未初始化
CURSER_ALREADY_OPEN: 游标已经打开
DUP_VAL_ON_INDEX: 唯一索引对应的列上有重复的值
INVALID_NUMBER: 内嵌的 SQL 语句不能将字符转换为数字
NO_DATA_FOUND: 使用 select into 未返回行,或应用索引表未初始化的元素时
SUBSCRIPT_BEYOND_COUNT:元素下标超过嵌套表或 VARRAY 的最大值
SUBSCRIPT_OUTSIDE_LIMIT: 使用嵌套表或 VARRAY 时,将下标指定为负数
VALUE_ERROR: 赋值时,变量长度不足以容纳实际数据
LOGIN_DENIED: PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码
NOT_LOGGED_ON: PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据
PROGRAM_ERROR: PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包
ROWTYPE_MISMATCH: 宿主游标变量与 PL/SQL 游标变量的返回类型不兼容
SELF_IS_NULL: 使用对象类型时,在 null 对象上调用对象方法
STORAGE_ERROR: 运行 PL/SQL 时,超出内存空间
SYS_INVALID_ID: 无效的 ROWID 字符串
TIMEOUT_ON_RESOURCE: Oracle 在等待资源时超时
用户自定义异常
DECLARE
v_ename varchar2(10);
v_empno number(4) := &v_empno;
BEGIN
IF v_empno < 0 THEN
RAISE e_invalid_no; 或者下面这行
RAISE_APPLICATION_ERROR(-20000,'Employee number can not be negative');
ELSE
SELECT ename
INTO v_ename
FROM EMP
WHERE empno = v_empno;
DBMS_OUTPUT.PUT_LINE('Employee name is '||v_ename);
END IF;
END;
用户自定义异常和现有编号进行绑定
DECLARE
v_deptno number(2) := &v_deptno;
e_child_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(e_child_exists,-2292);
BEGIN
DELETE FROM dept
WHERE deptno= v_deptno;
EXCEPTION
WHEN e_child_exists THEN
DBMS_OUTPUT.PUT_LINE('Delete employees for No.'||v_deptno||' dept first');
END;
Oracle错误都可以使用OTHERS异常处理程序进行捕获和处理
DECLARE
v_deptno number(4) := &v_deptno;
v_dname varchar2(5);
v_loc varchar2(10);
BEGIN
SELECT dname,loc
INTO v_dname,v_loc
FROM dept
WHERE deptno = v_deptno;
DBMS_OUTPUT.PUT_LINE(v_dname||','||v_loc);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||chr(10)||SQLERRM); -->> chr(10)代表回车键
END;
总结
DECLARE
my_error1 EXCEPTION;
PRAGMA EXCEPTION_INIT(my_error1, -20001);
my_error2 EXCEPTION;
PRAGMA EXCEPTION_INIT(my_error2, -20002);
BEGIN
IF 1=2 THEN
raise_application_error(-20001,'err_1');
ELSE
raise_application_error(-20002,'err_2');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Not found');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('More data');
WHEN MY_ERROR1 THEN
dbms_output.put_line('This is a err_1 test');
WHEN MY_ERROR2 THEN
dbms_output.put_line('This is a err_2 test');
END;