-
Oracle9i
引入了
MERGE
命令
,
你能够在一个
SQ
L
语句中对一个表同时执行
inserts
和
updates
操作
. MER
GE
命令从一个或多个数据源中选择行来
updating
p>
或
inserting
到一个或多个
表
.
在
Oracle
10g
中
MERGE
有如下一些改进:
1
、
UP
DATE
或
INSERT
子句是可选的
2
、
p>
UPDATE
和
INSERT
子句可以加
WHERE
子句
3
、在
ON
条
件中使用常量过滤谓词来
insert
所有的行到目标表中
p>
,
不需要连接源表和目标表
4
、
UPDATE
子句后
面可以跟
DELETE
子句来去除一些不需要的行
首先创建示例表:
create table PRODUCTS
(
PRODUCT_ID INTEGER,
PRODUCT_NAME VARCHAR2(60),
CATEGORY
VARCHAR2(60)
);
insert into PRODUCTS values (1501,
'VIVITAR
35MM', 'ELECTRNCS');
insert into PRODUCTS values (1502,
'OLYMPUS
IS50', 'ELECTRNCS');
insert into PRODUCTS values (1600,
'PLAY GYM',
'TOYS');
insert into PRODUCTS values (1601, 'LAMAZE',
'TOYS');
insert into
PRODUCTS values (1666, 'HARRY
POTTER',
'DVD');
commit;
create table NEWPRODUCTS
(
PRODUCT_ID
INTEGER,
PRODUCT_NAME VARCHAR2(60),
CATEGORY VARCHAR2(60)
);
insert into
NEWPRODUCTS values (1502, 'OLYMPUS
CAMERA', 'ELECTRNCS');
insert
into
NEWPRODUCTS
values
(1601,
'LAMAZE',
'TOYS');
insert into NEWPRODUCTS values
(1666, 'HARRY
POTTER', 'TOYS');
insert into NEWPRODUCTS values
(1700, 'WAIT
INTERFACE', 'BOOKS');
commit;
1
、可省略
的
UPDATE
或
INSERT
子句
在
Oracle 9i, MERGE
语句要求你必须同时指定
INSERT
和
UPDATE
子句
.
而在
Oracle 10g,
你可以省略
UPDAT
E
或
INSERT
子句中的一个
.
下面的例子根据表
NEWPRODUCT
S
的
PRODUCT_ID
字段是否匹
配来
updates
表
PRODUCT
S
的信息
:
SQL> MERGE
INTO products p
2 USING newproducts
np
3 ON (t_id = t_id)
4 WHEN MATCHED THEN
5 UPDATE
6 SET t_name = t_name,
7 ry = ry;
3 rows
merged.
SQL> SELECT *
FROM products;
PRODUCT_ID PRODUCT_NAME CATEGORY
---------- -------------------- ----------
1501 VIVITAR 35MM ELECTRNCS
1502 OLYMPUS CAMERA ELECTRNCS
1600 PLAY GYM TOYS
1601 LAMAZE TOYS
1666 HARRY POTTER
TOYS
SQL>
SQL>
ROLLBACK;
Rollback complete.
SQL>
在上面例子中
,
MERGE
语句影响到是产品
id
为<
/p>
1502, 1601
和
1666
的行
.
它们的产品名字和
种
类被更新为表
newproducts
中的值
.
下面例子省略
UPDATE
子句
,
把表
NEWPROD
UCTS
中新
的
PRODUCT_ID
插入到表
PRODUCTS
中
,
对于在两个表中能够匹配上
PRODUCT
_ID
的数据不作
任何处理
.
从这个例子你能看到
PRODUCT_ID=1700
的行被插入到表
PRODUCTS
中
< br>.
SQL> MERGE INTO products p
2 USING newproducts np
3 ON (t_id = t_id)
4 WHEN NOT
MATCHED THEN
5 INSERT
6 VALUES (t_id, t_name,
7 ry);
1 row merged.
SQL> SELECT * FROM
products;
PRODUCT_ID
PRODUCT_NAME CATEGORY
----------
-------------------- ----------
1501 VIVITAR 35MM ELECTRNCS
1502
OLYMPUS IS50 ELECTRNCS
1600 PLAY
GYM TOYS
1601 LAMAZE TOYS
1666 HARRY POTTER DVD
1700 WAIT INTERFACE BOOKS
2
、
带条件的
Updates
和
Inser
ts
子句
你能够添加
WHERE
子句到
UPDA
TE
或
INSERT
子句中去
,
来跳过
update
或
insert
操作对某些
行的处理
.
下面例子根据表
NEWPRODU
CTS
来更新表
PRODUCTS
数据
,
但必须字段
CATEGORY
p>
也得
同时匹配上
:
SQL> MERGE INTO products p
2 USING newproducts np
3 ON (t_id = t_id)
4 WHEN MATCHED
THEN
5 UPDATE
6 SET
t_name = t_name
7 WHERE ry = ry;
2 rows merged.
SQL> SELECT * FROM
products;
PRODUCT_ID
PRODUCT_NAME CATEGORY
----------
-------------------- ----------
1501 VIVITAR 35MM ELECTRNCS
1502
OLYMPUS CAMERA ELECTRNCS
1600 PLAY
GYM TOYS
1601 LAMAZE TOYS
1666 HARRY POTTER DVD
SQL>