在每列的过程中提高父键完整性约束
Posted
技术标签:
【中文标题】在每列的过程中提高父键完整性约束【英文标题】:Raise parent key integrity constraint in procedure for each column 【发布时间】:2013-09-26 11:57:20 【问题描述】:我在将数据插入表的包中有以下代码。
我能够得到父键未找到异常。我怎样才能专门为每列获取违反约束的消息?例如。如果违反proj_id
,则引发异常,如果违反proj_code
,则引发另一个异常。
PROCEDURE add_project(
p_proj_id project.proj_id%TYPE,
p_proj_desc project.proj_desc%TYPE,
p_proj_code project.proj_code%TYPE,
p_proj_date project.proj_date%TYPE
)
IS
parent_not_found exception;
pragma exception_init(parent_not_found, -2291);
BEGIN
INSERT
INTO projects (proj_id,proj_desc,proj_code,proj_date) values
(p_proj_id,p_proj_desc,p_proj_code,p_proj_date);
exception
when parent_not_found then
raise_application_error(-20001,'Invalid');
END;
【问题讨论】:
【参考方案1】:看看EXCEPTION_INIT Pragma。
DECLARE
l_parentnotfound exception;
l_res integer;
PRAGMA EXCEPTION_INIT(l_parentnotfound, -2291);
BEGIN
-- check if the parent key exists
select 1 into l_res from codes where code = proj_code;
-- if not, raise exception
if l_res <> 1 then
raise l_parentnotfound;
end if;
INSERT INTO projects (proj_id,proj_desc,proj_code,proj_date) values (p_proj_id,p_proj_desc,p_proj_code,p_proj_date);
EXCEPTION WHEN l_parentnotfound THEN
-- handle the error
END;
或者您可以使用WHEN OTHERS
并查找SQLCODE
。
编辑:
请注意,您不必手动检查父键是否存在以引发异常,您可以继续使用:
DECLARE
l_parentnotfound exception;
l_res integer;
PRAGMA EXCEPTION_INIT(l_parentnotfound, -2291);
BEGIN
INSERT INTO projects (proj_id,proj_desc,proj_code,proj_date) values (p_proj_id,p_proj_desc,p_proj_code,p_proj_date);
EXCEPTION WHEN l_parentnotfound THEN
-- handle the error
END;
但是,如果您希望能够轻松获得违反的约束名称,则为每一列手动引发异常会很有用。您也可以尝试使用USER_CONSTRAINTS
和USER_CONS_COLUMNS
获取约束名称。
获取违反约束名称的另一种方法是解析SQLERRM
错误消息。
【讨论】:
Yann39 对此表示感谢。是否可以获取约束名称? 我不确定,也许你可以查询user_constraints
。如有必要,我会看一下并更新我的答案。另请注意,您不必像我一样强制检查父键是否存在以手动引发异常。【参考方案2】:
试试
create PROCEDURE add_project(p_proj_id project.proj_id%TYPE,
p_proj_desc project.proj_desc%TYPE,
p_proj_code project.proj_code%TYPE,
p_proj_date project.proj_date%TYPE) IS
BEGIN
INSERT INTO projects
(proj_id, proj_desc, proj_code, proj_date)
values
(p_proj_id, p_proj_desc, p_proj_code, p_proj_date);
--add this
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
【讨论】:
以上是关于在每列的过程中提高父键完整性约束的主要内容,如果未能解决你的问题,请参考以下文章
SQL ORA-02291: 违反完整性约束 - 未找到父键