日期:2014-05-16  浏览次数:20484 次

自定义oracle 抛出异常

数据库异常抛出

Caused by: java.sql.SQLException: ORA-02291: 违反完整约束条件 (xxx.FK_yyyy) - 未找到父项关键字

?

如何自定义oracle 抛出的异常?

?

使用RAISE_APPLICATION_ERROR 函数

该函数是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者前台开发语言)

?

如何使用

RAISE_APPLICATION_ERROR( error_num IN NUMBER, error_msg IN VARCHAR2);

error_num :错误码,-20000到-20999 之间,这样就不会与ORACLE已有的的错误代码发生冲突。

error_msg :错误信息, 的长度不能超过 2k,否则截取 2k。

?

举例说明:要删除树形结构的某个节点

java程序 1.判断该节点状态是否能够被删除

? ? ? ? ? ? ? 2.判断该节点下面是否有子节点,如果有不能删除

? ? ? ? ? ? ? 3.删除该节点

?

如果用自定义异常则可以创建如下代码

?

declare  
    row_count int;  
begin  
    select count(*) into row_count from tree_table where parent_id = '0001' ;  
    if (row_count > 0) then  
       RAISE_APPLICATION_ERROR(-20001, '该节点有子节点,不能被删除。');
    end if;  
    select count(*) into row_count from tree_table where id = '0001' and status > 1 ;  
    if (row_count > 0) then  
        RAISE_APPLICATION_ERROR(-20002, '该节点已被确认,不能被删除。');
    end if;  
    delete from tree_table where id = '0001';  
end;  
?

?

然后程序调用

?

try{
     ....jdbc调用上面得语句(替换'0001'为传入的节点id).....

}catch(Exception e) {
        String error = "";
	if (e instanceof InvocationTargetException) {
		Throwable targetEx = ((InvocationTargetException) e).getTargetException();
		error =  targetEx.getMessage();
	} else {
		error = e.getMessage();
	}
        return error;
}
?

?

?

?