oracle异常不会转到异常块

时间:2019-03-11 21:52:16

标签: oracle plsql

我需要更新一些使用动态sql的代码,并且在insert语句的列中可能有重复的列名。

所以我想处理这个问题,ORA-00957:列名重复。该错误不会由异常块中最通用的“其他时间”处理。如果我对唯一约束违例进行测试,那么它会这样做。

遵循一些测试代码:

create table animal (id number , animal_type number, 
  animal_name varchar2(20), constraint id primary key(id));
-----------------------------------------------------
begin
for i in 1.. 100 loop
    insert into animal(id, animal_type, animal_name) 
      values(i,floor(dbms_random.value(1,30)),'animal'||i);
end loop;
end;
-----------------------------------------------------
DECLARE
--  e_duplicate_column exception;
--  pragma exception_init(e_duplicate_column,-957);
BEGIN
    insert into animal(id, animal_name, animal_name) 
      values(1000003, 'animal 1000003', 'animal 1000003');
EXCEPTION
WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE);
    dbms_output.put_line(SQLERRM);
END;

我试图在这里获取代码,因为杂用指令也无法正常工作(即到达)。但是,即使没有“当其他人时”,也不会发生这种情况。

任何见解都值得赞赏。 干杯,罗伯特

PS oracle 12C,在sqldeveloper和toad上尝试过

1 个答案:

答案 0 :(得分:2)

您的测试代码未使用动态SQL,这是生成ORA-00957错误所必需的。如果没有动态SQL,Oracle将在编译您的块时抛出ORA-00957,我认为您误解为Oracle实际上正在运行您阻塞并且跳过了异常处理程序。

请尝试以此作为测试(确保在客户端中启用了DBMS输出!):

DECLARE
--  e_duplicate_column exception;
--  pragma exception_init(e_duplicate_column,-957);
BEGIN
    execute immediate q'[insert into animal(id, animal_name, animal_name) values(1000003, 'animal 1000003', 'animal 1000003')]';
EXCEPTION
WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE);
    dbms_output.put_line(SQLERRM);
END;
-957
ORA-00957: duplicate column name