oracle插入数据忽略重复,继续执行下一条语句

whoisme123 2009-11-09 04:09:24
oracle插入数据,数据有4列,当4列数据都相同时,忽略重复,继续执行下一条语句
不要说加什么唯一性约束或联合主键,这个它会报错,然后就停止插入了
请各位大大指点,谢谢
...全文
2707 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
todayandtomorrow 2009-11-11
  • 打赏
  • 举报
回复
那天走得匆忙,exception都没声明。。。
waymar 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pgy8288 的回复:]
网上找的一个MERGE的例子,修改一下应该可以符合你的要求.
SQL code
MERGEINTO products p
USING newproducts npON (p.product_id= np.product_id)WHEN MATCHEDTHENUPDATESET p.product_name= np.product_name,
p.category= np.categoryWHERE p.category='DVD'WHENNOT MATCHEDTHENINSERTVALUES (np.product_id, np.product_name, np.category)WHERE np.category!='BOOKS'
[/Quote]


正解,数据库好好用
doumingjunniit 2009-11-11
  • 打赏
  • 举报
回复
学习了.
pgy8288 2009-11-10
  • 打赏
  • 举报
回复
网上找的一个MERGE的例子,修改一下应该可以符合你的要求.

MERGE INTO products p
USING newproducts np ON (p.product_id = np.product_id)
WHEN MATCHED THEN
UPDATE
SET p.product_name = np.product_name,
p.category = np.category
WHERE p.category = 'DVD'
WHEN NOT MATCHED THEN
INSERT
VALUES (np.product_id, np.product_name, np.category)
WHERE np.category != 'BOOKS'


whoisme123 2009-11-10
  • 打赏
  • 举报
回复
太感谢大家了,我先测试一下
pobaby 2009-11-10
  • 打赏
  • 举报
回复
先查下,存在就不处理,不存在insert应该可以。


[Quote=引用 3 楼 liusong_china 的回复:]
SQL codedeclare
numint;beginselectcount(*)into numfrom tbwhere col1='**'and col2='**'and col3='**'and col4='**';if num=0theninsertinto tbvalues('**','**','**','**');endif;end;/
[/Quote]
shiyiwan 2009-11-09
  • 打赏
  • 举报
回复
你还在公司?今天雨太大了没带伞,郁闷
shiyiwan 2009-11-09
  • 打赏
  • 举报
回复
这个要支持

[Quote=引用 9 楼 todayandtomorrow 的回复:]
4列弄成联合主键,当插入的时候用save exception,这样不会断开job,可以继续插入下一行。
插入语法:SQL codedeclare
type t_nameistableof
table_name.name%typeindexby binary_integer;
v_name t_name;
type t_curis refcursor;
v_cur t_cur;
v_sqlvarchar2(100);begin
v_sql='select name from table_name';open v_curfor v_sql;
loopfetch v_curbulkinto v_name;
forall iin v_name.first..v_name.lastsave exceptionsinsertinto table_name
(name)values(v_name(i))
exceptionwhen ex_dml_errorsthen
l_error_count := sql%bulk_exceptions.count;end loop;end ;


错误地方请指正。
[/Quote]
sharpidd 2009-11-09
  • 打赏
  • 举报
回复
学习了.
tiancx82 2009-11-09
  • 打赏
  • 举报
回复
路过
todayandtomorrow 2009-11-09
  • 打赏
  • 举报
回复
4列弄成联合主键,当插入的时候用save exception,这样不会断开job,可以继续插入下一行。
插入语法:
declare
type t_name is table of
table_name.name%type index by binary_integer;
v_name t_name;
type t_cur is ref cursor;
v_cur t_cur;
v_sql varchar2(100);
begin
v_sql ='select name from table_name';
open v_cur for v_sql;
loop
fetch v_cur bulk into v_name;
forall i in v_name.first..v_name.last save exceptions

insert
into table_name
(name)
values(v_name(i))
exception
when ex_dml_errors then
l_error_count := sql%bulk_exceptions.count;
end loop;
end ;



错误地方请指正。
Adebayor 2009-11-09
  • 打赏
  • 举报
回复
应该弄成联合主键,有重复数据就通过plsql抛个异常,不进行insert ,这种效率会高些吧
Adebayor 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sbaz 的回复:]
可以开游标,然后处理;
但是如果数据量太大的话,每条数据都commit也很慢。
[/Quote]
嗯,通常这种需求 数据量都是很大的
一方晴空 2009-11-09
  • 打赏
  • 举报
回复
insert into table1 select distinct * from table2 where id not in (select id from table1)
YY_MM_DD 2009-11-09
  • 打赏
  • 举报
回复
写个存储过程...把异常忽略不就行了??
With Others Exception

Null;

end ......
超叔csdn 2009-11-09
  • 打赏
  • 举报
回复
可以开游标,然后处理;
但是如果数据量太大的话,每条数据都commit也很慢。
liusong_china 2009-11-09
  • 打赏
  • 举报
回复
declare
num int;
begin
select count(*) into num from tb where col1 = '**' and col2 = '**' and col3 = '**' and col4 = '**';
if num = 0 then
insert into tb values('**','**','**','**');
end if;
end;
/
Adebayor 2009-11-09
  • 打赏
  • 举报
回复
关注ing
一方晴空 2009-11-09
  • 打赏
  • 举报
回复
说的更清楚一点吧,还是有点模糊

3,494

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧