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/18285oracle 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来讲,会带来另外一个问题,性能因为无端的增加了一下调用。所以,根据自己的实际情况,选择适合自己的才是最好的。