Oracle exception(三)

2014-11-24 12:53:02 · 作者: · 浏览: 2
equence当游标中数据集已经取完,然后再一次进行FETCH操作时将触发该异常。

25 PLS-00382: expression is of wrong type表达式类型错误。即在代码中赋予操作的左右两边的类型不等。

二 非预定义异常使用非预定义异常的步骤如下:

定义异常-> 关联异常和错误-> 引用例外

当定义Oracle错误和例外之间的关联关系时,要使用伪过程EXCEPTION_INTI。

下面以处理ORA-02291错误为例说明:

DECLARE

e_integrity EXCEPTION;

PRAGMA EXCEPTION_INIT(e_integrity, -2291);

BEGIN

UPDATE emp SET deptno = dno WHERE empno = &eno;

EXCEPTION

WHEN e_integrity THEN

dbms_output.put_line('该部门不存在.');

END;

/

三 自定义异常使用预定义异常和非预定义异常,程序可以捕获Oracle错误,并且在出现Oracle错误时自动触发对应的异常。但是在实际应用中,可能还会遇到其它错误,这时,可以为特定的情况自定义异常,不过需要显示触发该异常:通过定义异常,然后关联异常和错误,显示触发异常,最后在EXCEPTION中处理该异常。

示例:

DECLARE

l_error_message VARCHAR2(200);

e_user_exception EXCEPTION;

BEGIN

** ** ** ** **;

IF '出现错误' THEN

l_error_message := '定义错误信息';

RAISE e_user_exception;

END IF;

EXCEPTION

WHEN e_user_exception THEN

raise_application_error(-20001, l_error_message);

END;

/

四 例外函数1 SQLCODE,SQLERRM在PL/SQL块中出现Oracle错误时,通过使用例外函数可以取得错误号以及相关的错误消息。

SQLCODE 返回Oracle错误号。

SQLERRM 返回错误号对应的错误消息。

示例:

DECLARE

v_ename emp.ename%TYPE;

BEGIN

SELECT ename INTO v_ename FROM emp WHERE sal = &v_sal;

dbms_output.put_line('雇员名:' || v_ename);

EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line('不存在工资为' || v_sal || '雇员');

WHEN OTHERS THEN

dbms_output.put_line('错误号' || SQLCODE);

dbms_output.put_line(SQLERRM);

END;

/

2 RAISE_APPLICATION_ERROR在存储过程,函数和包中使用RAISE_APPLICATION_ERROR可以自定义错误号和消息。

raise_application_error:用于自定义错误消息(用于程序段中)

语法:

raise_application_error(error_number,message[,{TRUE | FALSE}]);

error_number : 错误号,范围是: -20000 ~ -20999之间的负整数;

message : 错误消息,长度不能超过2048字节;

第三个可靠选参数,如果TRUE,该错误会被放在先前错误堆栈中;如果FALSE(默认),则替换先前所有错误.

示例:

CREATE OR REPLACE PROCEDURE raise_comm

(

eno NUMBER,

commission NUMBER

) IS

v_comm emp.comm%TYPE;

BEGIN

SELECT comm INTO v_comm FROM emp WHERE emp = eno;

IF v_comm IS NULL THEN

raise_application_error(-20001, '该员工无补助.');

END IF;

EXCEPTION

WHEN NO_DATA_FOUND THEN

dbms_output.put_line('该雇员不存在.');

END;

/

摘自 朱金托的专栏