исключение оракула не собирается в блок исключения - PullRequest
1 голос
/ 12 марта 2019

Мне нужно обновить код, который использует динамический sql и потенциально может иметь повторяющиеся имена столбцов в столбцах оператора вставки.

Итак, я хотел справиться с этим, 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 Ответ

2 голосов
/ 12 марта 2019

Ваш тестовый код не использует динамический SQL, который необходим для генерации ошибки ORA-00957.Без динамического SQL Oracle сгенерирует ORA-00957 при компиляции вашего блока, что, как мне кажется, вы неправильно истолковываете как Oracle: при выполнении вы блокируете и пропускаете обработчик исключений.

Попробуйте вместо этогов качестве теста (убедитесь, что в вашем клиенте включен вывод СУБД!):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...