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

create or replace function fn_merge_index(statdate      in date,cpid          in varchar2,indextypecode in number,indexitemcode in number,indexdata     in varchar2)return number isnumb number;
beginselect count(*)into numbfrom cp_index_statistics_recwhere stat_date = to_date(to_char(statdate, 'yyyy/mm/dd'), 'yyyy/mm/dd')and cp_id = cpidand index_type_code = indextypecodeand index_item_code = indexitemcode;if numb = 0 then--数据不存在,insertbegininsert 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--数据存在,updatebeginupdate cp_index_statistics_recset 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 = cpidand index_type_code = indextypecodeand 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运行成功。

转载于:https://www.cnblogs.com/gcczhongduan/p/5142090.html

Oracle实现数据不存在则插入,数据存在则更新(insert or update)相关推荐

  1. insert数据时,获取插入数据的id

    insert数据时,获取插入数据的id 当运行完插入语句后,执行select @@identity就可得到自动生成的id 如果是sql server 最好用select SCOPE_IDENTITY( ...

  2. 使用SQLServer2005插入一条数据时返回当前插入数据的ID

    使用SQLServer2005插入一条数据时返回当前插入数据的ID 在执行完插入后 再执行 select @@identity from users 就OK 就是刚才插入的那行的 ID了 补充: @@ ...

  3. GIS数据的查找,插入,删除,更新(ArcEngine)

    1.查找数据 1).利用FeaturCursor进行空间查询 //利用构造的Envelope(矩形框),查找和Envelope相交的FeatureClass的要素集 //结果数据利用循环Feature ...

  4. php插入成功数据不显示,PHP插入数据不成功,什么原因呢?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //session_start(); $jobname=$_POST["jobname"]; $mane=$_POST["m ...

  5. mysql为什么不能插入数据_mysql为啥不能插入数据

    mysql为何不能插入数据? 安装AppServ后首次使用mysql,没有图形界面,在"MySql Command Line Client"的操作如下: ============= ...

  6. linux下批量新增数据,linux下批量插入数据到mysql

    一.源码(doMysql.c) #include #include #include /******************************************************* ...

  7. jdbc显示mysql的数据_JDBC链接mysql插入数据后显示问号的原因及解决办法

    1.在cmd中进入mysql查看默认的编码格式: mysql> show variables like "%char%"; 若不是utf8(因为我用的是utf8),关掉mys ...

  8. mysql 批量插入数据方法_mysql大批量插入数据的4种方法示例

    前言 本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法一:循环插入 这个也是最普通的方式,如果数据量不是很大,可以使用, ...

  9. mysql数据库插入数据为空_插入数据成功,但是数据库中显示为空(菜鸟提问)...

    插入数据成功,但是数据库中显示为空(初学者提问). 这个问题很菜,实在是找不到办法. 为什么往数据库中插入数据显示成功,但是数据库中显示是空. +------+------+ |   name   | ...

  10. python数据库建表_Python3创建mysql数据表结构和插入数据

    上一篇文章,我们已经成功通过 python3 连接到了数据库并新建了 spiders 数据库,今天我们就继续来学习 python3 如何创建 mysql 数据表及插入数据. import pymysq ...

最新文章

  1. Sublime Text3 运行Python 出现Error:Decode error - output not utf-8
  2. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.5. WAL内部...
  3. python-shutil学习
  4. 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
  5. java如何抽象一辆车,java新职篇:面向对象之抽象
  6. CCKS 2018 | 最佳论文:南京大学提出 DSKG,将多层 RNN 用于知识图谱补全
  7. [Magento error] The url is not accessible, unable to read response
  8. 设置RadioButton控件中文本的位置.
  9. Java-Volatile的实现(待删除)
  10. 新的任务范式:Program-guided Tasks
  11. 「leetcode」700. 二叉搜索树中的搜索:【递归法】【迭代法】详解
  12. pycharm连接github
  13. 汇编语言--寄存器间接寻址
  14. linux swap shayisi,临时邮箱,10分钟邮箱域名收集(持续更新)
  15. base64码通过http传输 +号变 空格 问题解决
  16. 借助Net-Speeder对服务器进行优化
  17. 独家强大情侣头像网名个性签名多功能工具微信小程序源码下载
  18. 在anaconda中安装tensorflow
  19. Kubernetes网络插件flannel和calico
  20. Android 手机红外遥控器实现

热门文章

  1. Lucene 中文分词器 Ik-Analyzer 使用教程
  2. 普通队列(数组实现)
  3. php编程之如何调用支付宝支付接口的实现
  4. 量子力学或证实人类生死并无意义
  5. mysqlbinlog配置
  6. linux 远程脚本批量 scopy文件
  7. 使用JUnit-4.11报java.lang.NoClassDefFoundError:
  8. ASP.NET MVC2用户界面的巨大改变
  9. 落实业务服务管理从基础设施管理做起
  10. 系统设计和机器学习算法