假设我有一个Oracle PL / SQL块,它将记录插入表中,需要从唯一约束错误中恢复,如下所示:
begin
insert into some_table ('some', 'values');
exception
when ...
update some_table set value = 'values' where key = 'some';
end;
是否可以为某些内容替换省略号以捕获唯一约束错误?
答案 0 :(得分:65)
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
UPDATE
答案 1 :(得分:26)
我确定你有理由,但为了以防万一......你还应该考虑使用“合并”查询:
begin
merge into some_table st
using (select 'some' name, 'values' value from dual) v
on (st.name=v.name)
when matched then update set st.value=v.value
when not matched then insert (name, value) values (v.name, v.value);
end;
(将上面的内容修改为开始/结束块;显然你也可以独立于程序运行它。)
答案 2 :(得分:12)
我怀疑您正在寻找的条件是DUP_VAL_ON_INDEX
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('OH DEAR. I THINK IT IS TIME TO PANIC!')
答案 3 :(得分:0)
作为显式捕获和处理异常的替代方法,您可以通过在插入语句中添加/*+ hint */
来指示Oracle捕获并自动忽略该异常。这比显式捕获异常然后明确说明应如何处理要快一点。它也更容易设置。缺点是您不会从Oracle收到任何有关捕获到异常的反馈。
在此示例中,我们将从另一个表或一个内部查询中进行选择,然后将结果插入到名为TABLE_NAME
的表中,该表对名为IDX_COL_NAME
的列具有唯一约束。
INSERT /*+ ignore_row_on_dupkey_index(TABLE_NAME(IDX_COL_NAME)) */
INTO TABLE_NAME(
INDEX_COL_NAME
, col_1
, col_2
, col_3
, ...
, col_n)
SELECT
INDEX_COL_NAME
, col_1
, col_2
, col_3
, ...
, col_n);
如果您的目标是抓住并处理(即打印或更新违反约束的行),这不是一个很好的解决方案。但是,如果您只是想抓住它而忽略违规行,那么就可以完成这项工作。