oracle 存在则insert插入 不存在则更新update,Oracle实现数据不存在则插入,数据存在则更新(insert or update)...

思路是写一个函数,先按条件查询数据,如果查询到数据则更新,如果没有查询到数据则插入:

create or replace function fn_merge_index(statdate in date,

cpid in varchar2,

indextypecode in number,

indexitemcode in number,

indexdata in varchar2)

return number is

numb number;

begin

select count(*)

into numb

from cp_index_statistics_rec

where stat_date = to_date(to_char(statdate, 'yyyy/mm/dd'), 'yyyy/mm/dd')

and cp_id = cpid

and index_type_code = indextypecode

and index_item_code = indexitemcode;

if numb = 0 then

--数据不存在,insert

begin

insert into cp_index_statistics_rec

(stat_id,

stat_date,

diagnosis,

cp_id,

is_validate,

index_type_code,

index_item_code,

stat_data,

stat_create_date,

cp_name)

values

(cp_index_statistics_rec_seq.nextval,

to_date(to_char(statdate, 'yyyy/mm/dd'), 'yyyy/mm/dd'),

'',

cpid,

1,

indextypecode,

indexitemcode,

indexdata,

(select sysdate from dual),

(select cp_name from cp_templet_master where cp_id = cpid));

commit;

end;

else

--数据存在,update

begin

update cp_index_statistics_rec

set is_validate = 1,

stat_data = indexdata,

stat_create_date =

(select sysdate from dual)

where stat_date = to_date(to_char(statdate, 'yyyy/mm/dd'), 'yyyy/mm/dd')

and cp_id = cpid

and index_type_code = indextypecode

and index_item_code = indexitemcode;

commit;

end;

end if;

return numb;

end fn_merge_index;注意to_date(to_char(statdate, 'yyyy/mm/dd'), 'yyyy/mm/dd')这个写法,如果写成to_date(statdate, 'yyyy/mm/dd'),根据NLS不同,可能导致数据出错。具体请看

这里

另外oracle提供了merge into可以实现此功能,理论上讲比上面的效率会高,但是没做试验。merge into有个缺点就是在10g以下版本的oracle中会出现问题,导致比较严重的后果(据说会把所有的数据都更新,而9i又不支持在update后加条件),所以我没有采用这个方法。

merge into的用法:

merge into bonuses d

using (select employee_id, salary, department_id from employees

where department_id = 80) s

on (d.employee_id = s.employee_id)

when matched then update set d.bonus = d.bonus + s.salary*.01

when not matched then insert (d.employee_id, d.bonus)

values (s.employee_id, s.salary*0.01); 另外还有个思路,直接update,执行后会返回受影响的行数,如果行数为0,表示没有符合条件的数据,后面执行insert;如果行数大于0,表示有符合条件的行数且update执行成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值