首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Oracle merge into 使用记录

2023-11-08 来源:华佗小知识

myd_nsrdt nusing (select ‘9‘as mydtmid,‘1‘as tmtype,‘370200123456788‘as nsrsbh,‘‘ as nsrmc, ‘sn‘ as region,4 as pf,‘‘as yj,‘18888888888‘ as phone,‘18888888888‘ as nowphone,sysdate as addtime from dual) mon(n.mydtmid=m.mydtmid and n.nsrsbh=m.nsrsbh)when matched then update set n.pf=m.pf,n.yj=m.yj where n.mydtmid=m.mydtmid and n.nsrsbh=m.nsrsbhwhen not matched then insert values(seq_myd.nextval,m.mydtmid,m.tmtype,m.nsrsbh,m.nsrmc,m.region,m.pf,m.yj,m.phone,m.nowphone,m.addtime)

 

Oracle merge into 使用记录

标签:

小编还为您整理了以下内容,可能对您也有帮助:

oraclemergeinto用法及例子

  ORACLE I中加入了MERGE

  语法

  MERGE [hint] INTO [schema ] table [t_alias]

  USING [schema ] { table | view | subquery } [t_alias]

  ON ( condition )

  WHEN MATCHED THEN merge_update_clause

  WHEN NOT MATCHED THEN merge_insert_clause;

  创建测试数据表

  create table tj_test(id number name varchar ( ) age number);

  向表中插入数据

  insert into tj_test values ( jan );

  insert into tj_test values ( kk );

  insert into tj_test values ( joe );

  select * from tj_test;

  查询结果如下

   jan

   kk

   joe

  创建另一新表

  create table tj_test as select * from tj_test where =

  插入一条数据

  insert into tj_test values ( jlk );

  select * from tj_test

  查询结果如下

   jkl 注意 这里的的NAME字段中的值是jkl

  使用MERGE 实现有则更新 无则插入 sql语句如下

  merge into tj_test tt

  using tj_test tt

  on (tt id=tt id)

  when matched then

  update set

  tt name=tt name

  tt age=tt age

  when not matched then

  insert values(

  tt id

  tt name

  tt age)

  查询tj_test 表(对比原来表中的数据 更新了ID= ROW中字段NAME 同时多出两条新数据)

  select * from tj_test

  改变行数据如下

   jan 这里的原有jkl值被更新

   joe 原来表中没有的插入

   kk 原来表中没有的插入

  如果存在就更新 不存在就插入

   i已经支持了 是Merge 但是只支持select子查询

  如果是单条数据记录 可以写作select …… from al的子查询

  语法为

  MERGE INTO table

  USING data_source

  ON (condition)

  WHEN MATCHED THEN update_clause

  WHEN NOT MATCHED THEN insert_clause;

  如:

  MERGE INTO course c

  USING (SELECT course_name period

  course_hours

  FROM course_updates) cu

  ON (urse_name = urse_name

  AND c period = cu period)

  WHEN MATCHED THEN

  UPDATE

  SET urse_hours = urse_hours

  WHEN NOT MATCHED THEN

  INSERT (urse_name c period

  urse_hours)

  VALUES (urse_name cu period

lishixin/Article/program/Oracle/201311/18285

oracle merge的使用

Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle10g中MERGE有如下一些改进:

1、UPDATE或INSERT子句是可选的

2、UPDATE和INSERT子句可以加WHERE子句

3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表

4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

语法:

MERGEHINTINTO SCHEMA .TABLE T_ALIAS

USINGSCHEMA . {TABLE | VIEW |SUBQUERY } T_ALIAS

ON (CONDITION)

WHENMATCHEDTHEN MERGE_UPDATE_CLAUSE

WHENNOTMATCHED THEN MERGE_INSERT_CLAUSE / MERGE_DELETE_CLAUSE;

ORACLE关于merge into用法!

qiyechao
说的很对,when matched then 和 when not matched then 后面只能加insert() values 或者 update set ,B的域只在using里面的查询有用,AND B.SHIPFID ='' 写在using里面,即
MERGE INTO MSA2008BS.ATYW_ZS_GCZL A
USING (SELECT * fROM LOADTMP.MSA2008BS_ATYW_ZS_GCZL WHERE ETL_F IN ('I','D','A') AND B.SHIPFID ='' ) B
ON (A.ATZSCZLOID=B.ATZSCZLOID)
WHEN MATCHED THEN UPDATE SET
A.SHIPFID =B.SHIPFID ,
A.GCZLDJZHM=B.GCZLDJZHM ,
A.CBDJH =B.CBDJH
WHEN NOT MATCHED THEN
INSERT(A.ATZSCZLOID,A.SHIPFID,A.GCZLDJZHM,A.CBDJH,A.CBCZR)
VALUES(B.ATZSCZLOID,B.SHIPFID,B.GCZLDJZHM,B.CBDJH,B.CBCZR)

ORACLE关于merge into用法!

qiyechao
说的很对,when matched then 和 when not matched then 后面只能加insert() values 或者 update set ,B的域只在using里面的查询有用,AND B.SHIPFID ='' 写在using里面,即
MERGE INTO MSA2008BS.ATYW_ZS_GCZL A
USING (SELECT * fROM LOADTMP.MSA2008BS_ATYW_ZS_GCZL WHERE ETL_F IN ('I','D','A') AND B.SHIPFID ='' ) B
ON (A.ATZSCZLOID=B.ATZSCZLOID)
WHEN MATCHED THEN UPDATE SET
A.SHIPFID =B.SHIPFID ,
A.GCZLDJZHM=B.GCZLDJZHM ,
A.CBDJH =B.CBDJH
WHEN NOT MATCHED THEN
INSERT(A.ATZSCZLOID,A.SHIPFID,A.GCZLDJZHM,A.CBDJH,A.CBCZR)
VALUES(B.ATZSCZLOID,B.SHIPFID,B.GCZLDJZHM,B.CBDJH,B.CBCZR)

oracle中多个进程可以使用merge into语句对同一个表操作不,能锁表吗

您好,这样的:

会对表加3号锁,会对更新的记录行加6号锁,所以,如果多个进程所更新的不是表中的同一行记录,

不会形成你所理解的锁表(其它进程要等某一进程先提交或回滚)。

Merge不一定锁表,前提要看你怎么写,即使不用merge,在一个大表且没有任何索引的情况下update数据,也有可能锁表:

SET IDENTITY_INSERT TargetTable OFF;

SET NOCOUNT ON

merge TargetTable t

using SourceTable s

on t.ff1=s.ff1

when not matched

then insert values(s.ff2)

--when matched and t.ff2='delete'

--then delete

when matched

then update set t.ff2=s.ff2;

应该怎么改呢,由于是测试,只有主键聚集索引。

我在100万行的数据量下进行了测试,使用update数据的话只有行锁。

Oracle数据库Merge Into 如何使用Sequence 而不“浪费”

2、测试前提:创建脚本。从上面的结果,我们可以非常清晰的看到6和7那里去了?--浪费掉了。4、解决。创建一个函数来获取相应的值。create or replace function get_sequence_nextval(f_schema in varchar2, f_sequence_name in varchar2) return numberisv_nextval number;beginexecute immediate 'select ' || f_schema || '.'||f_sequence_name||'.nextval from al' into v_nextval;return v_nextval;exceptionwhen others thenraise_application_error(sqlcode,sqlerrm);end;将3测试中的代码调整为:test.seq_test.nextval ==test.get_sequence_nextval('test','seq_test')再次调用,我们可以看到三条记录11、12、13已经紧跟着10了。--不浪费了。IDNAMESEQ_VALUET_STAMP11one 2012-11-18 下午 03:28:352  22012-11-18 下午 03:11:4633 32012-11-15 下午 03:11:464 four42012-11-19 下午 03:11:4652two 2012-11-18 下午 03:28:356  82012-11-18 下午 03:11:4673 92012-11-15 下午 03:11:468 four102012-11-19 下午 03:11:469  112012-11-18 下午 03:11:46103 122012-11-15 下午 03:11:4611 four132012-11-19 下午 03:11:465、结论及分析:使用Merge Into调用Sequence 类似于预编译,会直接将值赋组合相应的调用,而不管该matched 或 not matched是否成功执行。而使用一个function进行封闭以后,因为预编译时无法知道该值,所以不会进行预处理,因此也不会浪费sequence的值。但是,使用function来讲,会带来另外一个问题,性能因为无端的增加了一下调用。所以,根据自己的实际情况,选择适合自己的才是最好的。

显示全文