当前位置: 首页 > 知识库问答 >
问题:

违反约束时显示自定义消息PL/SQL

刁远
2023-03-14

我正在编写一个PL/SQL过程。我对一列有一个约束,它不允许值低于0而高于500。如果违反了这个约束(例如,“ID超出范围”),我需要显示一条自定义消息。目前,这是一个异常,也是GET中的输出。还有另一个过程输出错误,因此使用RAISE_APPLCATION_ERROR。

when VALUE_ERROR then
raise_application_error(-20002, 'Customer ID out of range');
"ORA-20000: ORA-02290: check constraint (s5849497.CK_ID_RANGE) violated"
"ORA-20000: Customer ID out or range"
set serveroutput on;

---------------------------------------------------------------
alter table customer
add constraint ck_id_range
check (custid > 0 and custid < 500);
---------------------------------------------------------------

create or replace procedure ADD_CUSTOMER_TO_DB(pcustid number, pcustname varchar2) as

begin
    insert into customer
    values (pcustid,pcustname,0,'OK');
exception
when DUP_VAL_ON_INDEX then
  raise_application_error(-20001, 'Duplicate customer ID');
when VALUE_ERROR then
  raise_application_error(-20002, 'Customer ID out of range');
when others then
  raise_application_error(-20000, SQLERRM);
end;

谢谢。

共有1个答案

韦泳
2023-03-14

我猜你得到了一个ORA-02290错误。在异常处理程序中捕获该异常的方法是声明并初始化特定错误代码的异常(在本例中为-2290),然后在处理程序中使用自定义异常:

create or replace procedure ADD_CUSTOMER_TO_DB(pcustid number,
                                               pcustname varchar2)
as
  eCheck_constraint_violated  EXCEPTION;
  PRAGMA EXCEPTION_INIT(eCheck_constraint_violated, -2290);
begin
    insert into customer
    values (pcustid,pcustname,0,'OK');
exception
when DUP_VAL_ON_INDEX then
  raise_application_error(-20001, 'Duplicate customer ID');
when eCheck_constraint_violated then
  raise_application_error(-20002, 'Customer ID out of range');
when others then
  raise_application_error(-20000, SQLERRM);
end;

正如您在上面看到的,我只是用新定义的异常替换了VALUE_ERROR。

如果您得到的错误不是-2290,只需将您看到的错误放在上面的pragma exception_init调用中,而不是-2290。

分享和享受。

 类似资料:
  • 我有以下用于自定义约束的代码:

  • 我试图理解TopCoder上的问题: 它特别指定 数组的长度为n. 每个元素都是介于1和k之间的整数,包括整数。 每当A和B是数组的两个连续元素(按此顺序)时,我们有(A 我的问题是关于第一个示例的第三个约束: 答案不应该是4吗?数组{2,1}发生了什么?有3个数组可以按照上述约束生成,但是thre也是可以生成的第四个数组,即{2,1}。问题的任何地方都写着,我们只能有唯一的数字组合。为什么我们不

  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?

  • 我有一个MathematicsAnswer引用的实体数学。如果对数学执行post请求,我会得到一个例外,即MathsAnswer上的字段不能为空。但我确实在球场上跳了起来。拜托,我需要这个解决方案<代码>java.sql。SQLIntegrityConstraintViolationException:列'question_id'不能为空。 sql架构: 实体类: MathsAnswers.jav

  • 但是我不想显示这样的消息:“插入记录失败。需要名称”。 有什么方法可以在PostgreSQL中显示自定义错误消息吗?

  • 我有自定义的消息onbeforeunload事件和工作良好,但我注意到今天它不再显示我的消息。相反,它显示“可能不会保存您所做的更改” 谁能告诉我如何修理它吗?