Как отловить уникальную ошибку ограничения для каждого индекса? - PullRequest
0 голосов
/ 04 июля 2018

У меня есть таблица данных с уникальным индексированием многих столбцов. При обновлении могут быть некоторые столбцы дубликаты. Я использую следующий способ отловить ошибки

 EXCEPTION
     WHEN DUP_VAL_ON_INDEX
        THEN OPEN cur FOR SELECT 'DUP' result from dual; 

Но теперь я хочу поймать исключение для каждого индекса, например

 EXCEPTION
         WHEN DUP_VAL_ON_INDEX1
            THEN OPEN cur FOR SELECT 'DUP1' result from dual; 
         WHEN DUP_VAL_ON_INDEX2
            THEN OPEN cur FOR SELECT 'DUP2' result from dual;

Так как я могу это сделать?

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете получить index_name от user_constraints, проанализировав сообщение об ошибке SQLERRM

WHEN DUP_VAL_ON_INDEX 
THEN
v_errm := SQLERRM;
SELECT INDEX_NAME into v_INDEX_NAME 
FROM user_constraints WHERE INDEX_OWNER||'.'||constraint_name = 
REGEXP_SUBSTR(v_errm,'unique constraint +\((.+)\) +violated',1,1,'i',1);

CASE  v_INDEX_NAME 
     WHEN 'INDEX1' THEN OPEN cur FOR SELECT 'DUP1' result from dual; 
     WHEN 'INDEX2' THEN OPEN cur FOR SELECT 'DUP2' result from dual;
     ELSE DBMS_OUTPUT.PUT_LINE(SQLERRM);
END CASE;

Обратите внимание, что вам также может понадобиться обработать NO_DATA_FOUND, поместив оператор выбора внутри другого BEGIN..EXCEPTION..END или используя другие методы. Но это не потребуется, если ваш user_constraints имеет правильные детали повышенного ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...