我必须在oracle DB中插入一些数据,而没有事先检查它是否已经存在。是否存在任何方法,在oracle上的transiction来捕获查询内的异常并处理它以不返回任何异常?最好是mysql风格的东西,比如
insert .... on duplicate key a=a
z6psavjg1#
您可以使用MERGE。尽管语法与常规插入有点不同;
MERGE
MERGE INTO test USING ( SELECT 1 AS id, 'Test#1' AS value FROM DUAL -- your row to insert here ) t ON (test.id = t.id) -- duplicate check WHEN NOT MATCHED THEN INSERT (id, value) VALUES (t.id, t.value); -- insert if no duplicate
要测试的SQLfiddle。
6tr1vspr2#
如果可以使用PL/SQL,并且在不希望出现任何重复的列上有唯一索引,则可以捕获异常并忽略它:
begin insert into your_table (your_col) values (your_value); exception when dup_val_on_index then null; end;
fykwrbwg3#
由于11g有ignore_row_on_dupkey_index提示,忽略唯一约束异常,并让脚本继续处理下一行(如果有),请参阅链接。不记录异常。它需要两个参数,表名和索引名。
ignore_row_on_dupkey_index
INSERT /*+ ignore_row_on_dupkey_index(my_table, my_table_idx) */ INTO my_table(id,name,phone) VALUES (24,'Joe','+49 19450704');
3条答案
按热度按时间z6psavjg1#
您可以使用
MERGE
。尽管语法与常规插入有点不同;要测试的SQLfiddle。
6tr1vspr2#
如果可以使用PL/SQL,并且在不希望出现任何重复的列上有唯一索引,则可以捕获异常并忽略它:
fykwrbwg3#
由于11g有
ignore_row_on_dupkey_index
提示,忽略唯一约束异常,并让脚本继续处理下一行(如果有),请参阅链接。不记录异常。它需要两个参数,表名和索引名。