我要投稿 投诉建议

怎样使用Oracle 10g MERGE语句更新数据行

时间:2020-12-26 16:46:09 句子 我要投稿

怎样使用Oracle 10g MERGE语句更新数据行

  使用Oracle 10g MERGE语句更新数据行

  在Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入()数据行,对于抽取、转换和载入类型的应用软件可以节省大量宝贵的时间,比如向数据仓库中加载数据,数据仓库中没有的数据行可以插入到数据仓库中,而已经存在的数据行也同时被更新。

  在MERGE语句引入的时候,需要同时使用一条UPDATE和一条INSERT语句,顺序也是固定的(先使用UPDATE语句,然后是INSERT语句)。如果您只需要使用其中的某一条一句,您只需要使用现有的INSERT或者UPDATE语句,而不必使用MERGE语句,而删除数据可以使用DELETE语句。

  在Oracle 10g R1版中,MERGE语句发生了变化,UPDATE或INSERT语句不再是必须的,而是可选项,您可以两者都用也可以都不用,而且,UPDATE语句也具备了DELETE的功能,您可以在同一个步骤中对现有的有效记录进行升级并清理废弃的记录。

  列表A创建了一个表格列出现有项目:项目号码、标题、开始日期、进度完成比例以及员工对项目的响应,还创建了一个事务表格使用MERGE语句进行升级批处理。

  列表A

  DROP TABLE open_projects;DROP TABLE project_updates;CREATE TABLE open_projects(pno NUMBER(6) PRIMARY KEY,title VARCHAR2(40),startdate DATE,pctdone NUMBER(3),empno NUMBER(6)INSERT INTO open_projects VALUES(10, 'Inventory servers', '08-JAN-07',0, 206);INSERT INTO open_projects VALUES(20, 'Upgrade Oracle on SRV01','15-JAN-07', 0, 206);INSERT INTO open_projects VALUES(30, 'Conduct skills assessment','22-JAN-07', 0, 210);CREATE TABLE project_updates(action CHAR(1),pno NUMBER(6),pctdone NUMBER(3),empno NUMBER(6)INSERT INTO project_updates VALUES('C', 10, 50, 214);INSERT INTO project_updates VALUES('D', 20, NULL, NULL);COMMIT;

  一个典型的MERGE语句从识别表格开始执行升级,而且对现有的记录进行筛选测试:

  MERGE INTO open_projects opUSING project_updatespuON (op.pno = pu.pno)

  表格open_projects会接受更新的数据,而project_updates表格则不会改变,如果项目号码(pno)在两个表格中都一样,那么数据行则被认为是相同的。

  MERGE语句剩下的部分是更新语句,以及DELETE WHERE语法。

  WHEN MATCHED THENUPDATE SET pctdone = pu.pctdone,empno = pu.empnoDELETEWHERE pu.action = 'D';

  列表B展示了MERGE语句运行前后的表格情况。

  列表B

  SQL> @mergedel_bPNO TITLE STARTDATE PCTDONE EMPNO10 Inventory servers 08-JAN-07 0 20620 Upgrade Oracle on SRV01 15-JAN-07 0 20630 Conduct skills assessment 22-JAN-07 0 210A PNO PCTDONE EMPNOC 10 50 214D 202 rows merged.PNO TITLE STARTDATE PCTDONE EMPNO10 Inventory servers 08-JAN-07 50 21430 Conduct skills assessment 22-JAN-07 0 210A PNO PCTDONE EMPNOC 10 50 214D 20SQL> spool off

  第一个事务对第10号项目进行了改变(操作‘c’),项目完成比例从0变成了50,项目员工人数变成了214人;第二个事务产出了第20号项目,“随后”的列表展示了删除后的状态,而project_updates表格没有发生改变。这个例子展示了这些语句并不是必须的,而且在MERGE语句中也并不需要使用INSERT语句。

  Oracle函数集锦

  感于总有些网友提出一些非常基础的问题,比如有没有实现某某功能的函数啊,某某函数是做什么用的啊,格式是什么等等,同时也感受到自己对oracle函数认识的不足,于是集中月余时间专注于oracle函数,小有心得不敢私藏,发之与诸公共享。

  本文并不准备介绍全部的oracle函数,当前情势下,俺也还没这个时间,需要学习的东西太多了,要把多数时间花在学习经常能用上的技术方面:),所以如果是准备深入了解所有oracle函数的朋友,还是去关注:Oracle SQL Reference官方文档更靠谱一些。

  本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的'一些函数。分二类介绍,分别是:

  著名函数篇-经常用到的函数

  非著名函数篇-即虽然很少用到,但某些情况下却很实用

  注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

  单值函数在查询中返回单个值,可被应用到select,where子句,start with以及connect by 子句和having子句。

  (一).数值型函数(Number Functions)

  数值型函数输入数字型参数并返回数值型的值。多数该类函数的返回值支持38位小数点,诸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and ATAN2支持30位小数点。

  1、MOD(n1,n2) 返回n1除n2的余数,如果n2=0则返回n1的值。

  例如:SELECT MOD(24,5) FROM DUAL;

  2、ROUND(n1[,n2]) 返回四舍五入小数点右边n2位后n1的值,n2缺省值为0,如果n2为负数就舍入到小数点左边相应的位上(虽然oracle documents上提到n2的值必须为整数,事实上执行时此处的判断并不严谨,即使n2为非整数,它也会自动将n2取整后做处理,但是我文档中其它提到必须为整的地方需要特别注意,如果不为整执行时会报错的)。

  例如:SELECT ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1) FROM DUAL

  3、TRUNC(n1[,n2] 返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。

  例如:SELECT TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;

【怎样使用Oracle 10g MERGE语句更新数据行】相关文章:

使用外贸英语语句05-20

怎样使用成考英语大纲复习12-27

离婚时,共同使用房的承租怎样处理09-21

oracle论文开题报告07-05

Oracle面试试题06-22

Oracle DBA面试试题06-17

Oracle面试试题题库06-17

如何更新新西兰驾照11-12

Oracle面试题库06-19

oracle论文的参考文献11-24