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存储过程的异常处理

oracle存储过程提示编译完成但存在错误,如何查看错误

sql server中怎样创建保存数据的存储过程

如何修复存储过程 Oracle PL/SQL 的错误?

oracle 存储过程异常处理

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下: