如何捕获每个索引的唯一约束错误?

时间:2018-07-04 02:23:30

标签: sql oracle plsql

我有一个数据表,其中包含许多唯一索引的列。更新时,可能有些列重复。我正在使用以下方式来捕获错误

 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 :(得分:3)

您可以通过分析错误消息user_constraints来从SQLERRM获取index_name

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;

请注意,您可能还必须通过将select语句放在另一个NO_DATA_FOUND中或使用其他方法来处理BEGIN..EXCEPTION..END。但是,如果您的user_constraints具有所提出约束的正确详细信息,则不需要这样做。