【发布时间】:2010-12-05 08:49:46
【问题描述】:
是否可以在 PL/SQL oracle 存储过程中抛出特定的错误消息,并在调用时在 Hibernate 中捕获它?
【问题讨论】:
标签: java oracle hibernate stored-procedures plsql
是否可以在 PL/SQL oracle 存储过程中抛出特定的错误消息,并在调用时在 Hibernate 中捕获它?
【问题讨论】:
标签: java oracle hibernate stored-procedures plsql
您可以在 pl/sql 上使用输出参数,并使用 ParameterMode.OUT 在代码中选择输出
CREATE OR REPLACE procedure proc (pls_out_put out number);
//调用输出
query.registerStoredProcedureParameter( "pls_out_put", Integer.class, ParameterMode.OUT);`
int result = (Integer) query.getOutputParameterValue("pls_out_put");
if (result==1){
message = new FacesMessage(FacesMessage.SEVERITY_INFO, "user defined message", "user defined message");
FacesContext.getCurrentInstance().addMessage(null, message);
} else if(result==0) {
message = new FacesMessage(FacesMessage.SEVERITY_INFO, "User defined message", "user defined message");
FacesContext.getCurrentInstance().addMessage(null, message);
}
【讨论】:
您可以从 PL/SQL 代码中抛出用户定义的错误消息。 -20000 到 -20999 之间的错误代码保留给用户指定的错误消息。
您可以通过在 PL/SQL 中调用 raise_application_error 函数来实现:
raise_application_error(-20001, 'Your error code message here');
这将像正常的 Oracle 错误一样传播。
编辑:
我不是 Hibernate 的用户,但我在尝试寻找答案时发现了这个问题,我认为它会引导你走上正确的道路。
try
{
// some hibernate calls
}
catch (GenericJdbcException ge)
{
if(ge.getCause() != null && ge.getCause() instanceof SQLException)
{
SQLException se = (SQLException)ge.getCause();
// *****************************************************************
// NOTE: THIS will be where you check for your customer error code.
// *****************************************************************
if(se.getErrorCode() == -20001)
{
// your error handling for this case
}
else
{
throw ge; // do not swallow unhandled exceptions
}
}
else
{
throw ge // do not swallow unhandled exceptions
}
}
【讨论】:
org.hibernate.exception.GenericJdbcException 是休眠异常 (hibernate.org/hib_docs/v3/api/org/hibernate/exception/…)。抓住它。