Вы можете получить 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
имеет правильные детали повышенного ограничения.