oracle sql中存储过程中的错误处理失败
Posted
技术标签:
【中文标题】oracle sql中存储过程中的错误处理失败【英文标题】:Error handling in a stored procedure in oracle sql failed 【发布时间】:2020-09-27 13:59:38 【问题描述】:我正在使用存储过程在 oracle SQL 中插入表,如果我正在创建的健康记录的编号已经存在,我想引发错误,不允许在表中插入值。这是代码:
BEGIN
SELECT MAHDAR_NUM INTO L_MAHDAR_NUM FROM MEDICALPST.mahdar WHERE MAHDAR_NUM=i.MAHDAR_NUM;
exception when others then
P_MSG:=NULL;
END;
IF L_MAHDAR_NUM IS NOT NULL
THEN
P_MSG:=006;
ROLLBACK;
END IF;
IF P_MSG IS NULL
THEN
INSERT INTO medicalpst.mahdar
VALUES (L_MAHDAR_SEQ,
L_DECISION_SEQ,
NULL,
NULL,
NULL,
...
但是,当我插入一个已经存在的MAHDAR_NUM
时,它并没有引发错误,而是将值插入到表中。
我会很感激任何帮助:)
【问题讨论】:
【参考方案1】:在我看来,你做错了。
MADHAR_NUM
列上应该有一个主键(或唯一键),可以防止输入重复项。它有什么好处?数据库负责处理重复项,您无需执行任何操作(除非您愿意)。在这种情况下,代码就像
begin
insert into madhar (col1, col2, col3, ...)
values (l_madhar_seq, l_decision_seq, null, ...);
exception
when dup_val_on_index then
null;
end;
(我不知道l_madhar_seq, l_decision_seq
来自哪里,但是 - 根据它们的名称,它们看起来像本地声明的变量。你应该知道)。
如果出于某种原因,您不想让数据库为您处理重复项,请考虑如下:
declare
l_madhar_num madhar.madhar_num%type;
begin
for i in (select madhar_num, ... from some_table where some_conditions) loop
begin
-- if this SELECT returns a value, nothing will happen as no commands
-- follow the SELECT
select madhar_num
into l_madhar_num
from madhar
where madhar_num = i.madhar_num;
exception
-- but, if that SELECT returns nothing, NO_DATA_FOUND will be raised
-- which means that you should insert a new row into a table.
when no_data_found then
insert into madhar (col1, col2, col3, ...)
values (l_madhar_seq, l_decision_seq, null, ...);
end;
end loop;
end;
【讨论】:
我已经有了另一个主键,即l_mahdar_seq,那么还有其他方法,或者我的代码有什么问题吗? @Littlefoot 截至“您的代码有任何问题” - 我编辑了我的答案并建议了您可能会尝试做的事情。看看有没有帮助。以上是关于oracle sql中存储过程中的错误处理失败的主要内容,如果未能解决你的问题,请参考以下文章
oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下: