oracle - 有没有办法在违反约束时给出用户友好的错误消息

标签 oracle user-friendly

说我有专栏 Gender和约束 CHECK( Gender IN ('F', 'M', 'OTHER')) .
如果我不小心忘记在客户端处理这个,用户会看到像ORA-02290: check constraint (SYS_C099871244) violated这对用户和维护或调试的开发人员都不是很有帮助

有没有办法提供开发人员定义的消息,如(伪)Java 的assert Gender IN (0,1):'Gender must be F or M'
我能想到的唯一方法是将约束移动到 BEFORE UPDATE OR INSERT 触发器,并在失败时执行 Raise_Application_Error( code, my_message ) .但我不喜欢

编辑
具体原因列表,根据评论
1. 我真的很喜欢让逻辑尽可能接近数据
2. 对于最终用户 Raise_Application_Error 消息与应用程序消息无法区分
3. 开发者会看到好的消息,即使绕过应用程序访问数据
4. 将约束移动到触发器是丑陋的(是吗?),所以我必须找到与 Raise_Application_Error 不同的地方

编辑2
1,5 年后,在我离开与数据库相关的工作后,我终于意识到,我真的不喜欢这个 - 代码重复 .我必须在服务器端和客户端重复完全相同的逻辑。最有可能的是 2 种不同的语言。并使它们保持同步。这太丑了。

尽管正如答案清楚地表明的那样,但我对此无能为力。所以现在是我成为好公民并最终接受答案的时候了(对不起,只是忘记了)。

最佳答案

如果您正在寻找一种方法来告诉 Oracle 始终将异常消息“ORA-02290:检查约束(SYS_C099871244)违反”替换为另一条消息,例如“ORA-20001:性别必须是 F 或 M”,那么答案是:不,这是做不到的。

您可以做的是提供一个开发人员可以在其代码中使用的解决方案,如下所示:

...
begin
    insert into emp (empno, gender) values (p_empno, p_gender);
exception
    when others then
       error_pkg.handle_exception;
end;
error_pkg.handle_exception过程将解析 Oracle 异常消息并提取约束的名称(如果它违反约束)并在交叉引用表中查找该约束名称以获取所需的消息,然后使用 raise_application_error用新消息重新引发异常。

我想 Oracle 可以提供这样的包和表作为标准,但也许因为在实践中系统中的错误处理有许多不同的要求,所以通常认为它不够有用。

关于oracle - 有没有办法在违反约束时给出用户友好的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068792/

相关文章:

java - 使用 TLS 证书的 JDBC 连接到 Oracle 数据库

android - 多列中的项目 - 微调器

firefox - 在用户干预最少的情况下安装多个 Firefox 扩展或插件的方法?

oracle - Oracle 难以管理简单任务的说法正确吗?没有高质量的管理应用程序吗?

java - Hibernate 和 Oracle10g : Tomcat times out

SQL select 和 case 组合

SQL select with ""netbeans without ""

Oracle-如何检查max_string_size是标准的还是扩展的