Plsql 捕获psql中的约束冲突

Plsql 捕获psql中的约束冲突,plsql,Plsql,我使用的是sql developer,并在我的一个表中添加了一个约束 constraint valid_gender check(gender in ('M','F','I','T')) 当我尝试使用plsql过程为性别添加一个带有“x”的条目时,它会因违反约束而失败(应该如此) 我想在plsql过程中添加一个“Catch”,这样如果验证了有效的性别,我就可以提出特定于它的应用程序错误。这可能吗?Oracle将引发一个异常,说明: ORA-02290:违反了检查约束(yourschema.va

我使用的是sql developer,并在我的一个表中添加了一个约束

constraint valid_gender check(gender in ('M','F','I','T'))
当我尝试使用plsql过程为性别添加一个带有“x”的条目时,它会因违反约束而失败(应该如此)


我想在plsql过程中添加一个“Catch”,这样如果验证了有效的性别,我就可以提出特定于它的应用程序错误。这可能吗?

Oracle将引发一个异常,说明:

ORA-02290:违反了检查约束(yourschema.valid_-gender)

您可以在异常处理程序中捕获该异常,并通过几种方式使用
raise\u application\u error
引发您自己的异常

1) 您可以专门捕获ORA-02290异常,如下所示:

declare
  e_check_violated exception
  pragma exception_init (e_check_violated, -2290);
begin
  insert ...
exception
  when e_check_violated then
    if sqlerrm like '%(yourschema.valid_gender)%' then
       raise_application_error(-20001,'Invalid gender');
    else
      raise;
    end if;
end;
2) 您可以捕获所有异常并检查它们:

begin
  insert ...
exception
  when others then
    if sqlerrm like 'ORA-02290:%(yourschema.valid_gender)%' then
       raise_application_error(-20001,'Invalid gender');
    else
      raise;
    end if;
end;

在大型应用程序中,通常会有一个异常处理过程来概括这一点,并在表中查找特定于约束的消息。

您可以先测试它:

if gender_value not in ('M','F','I','T') then
    raise_application_error...
end if;

在代码中使用匿名块

  BEGIN
    INSERT or update...

    EXCEPTION
    WHEN dup_val_on_index THEN
    RISE...

    END;