我有一个数据表,其中包含许多唯一索引的列。更新时,可能有些列重复。我正在使用以下方式来捕获错误
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;
那我该怎么办?
答案 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
具有所提出约束的正确详细信息,则不需要这样做。