Plsql 捕获psql中的约束冲突
我使用的是sql developer,并在我的一个表中添加了一个约束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
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;