/*示例程序块2 重要*/
/*示例程序块2 重要*/
DECLARE
v_xm varchar2(8):='Jame';
v_zym varchar2(10):='计算机';
v_zxf number(2):=45; /*定义变量类型*/
BEGIN
UPDATE XS SET zxf=v_zxf
WHERE xm=v_xm;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('没有该人,需要插入该人');
INSERT INTO XS(XH,XM,ZYM,ZXF) VALUES('007',v_xm,v_zym,v_zxf);
END IF;
end;
Merge应用场合
构建平台
create table PRODUCTS
(
PRODUCT_ID INTEGER,
PRODUCT_NAME VARCHAR2(60),
CATEGORY VARCHAR2(60)
);
create table NEWPRODUCTS
(
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;
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;
Merge 插入记录、更新记录的语法格式:
•MERGE INTO tdest d
USING tsrc s
ON (s.srckey = d.destkey)
WHEN NOT MATCHED THEN
INSERT (destkey, destdata) VALUES (srckey, srcdata)
• WHEN MATCHED THEN
UPDATE SET d.destdata = d.destdata + s.srcdata;
•-- USING 子句用于指定要与目标联接的数据源。
•-- ON 子句用于指定决定目标与源的匹配位置的联接条件。
•-- WHEN 子句用于根据ON 子句的结果指定要执行的操作。
注意:当数据不匹配时,执行insert 语句的不同(省略了into 和
目标 表的名称);
当数据匹配时,执行update 语句的不同(省略了update之后的
目标表名称)。
使用表时必须使用表的别名。
考虑有可能的情况是:
1. 原表 xs_s中有该学生,但是目的表xs_d中没有该学生,则需要将原表中的学生insert 到目的表。
2. 原表xs_s中有该学生,而且xs_d中也有该学生,则需要根据原表中的学生信息 update 目的表,或者删除目的表中的部分记录
检查表XS_JSJ中的数据是否和表XS的数据相匹配,
如果匹配则使用INSERT子句执行插入数据行。
搭建平台:create table xs1 as select * from xs;
不统一。目前的想法是,合并两个表中所有的记录到xs_d中。
-- 使用MERGE语句XS_JSJ表中新增的数据插入表XS中:
MERGE INTO XS a
USING XS1 b
ON(a.XH=b.XH)
WHEN NOT MATCHED THEN INSERT(a.xh,a.xm,a.zym,a.xb,a.cssj,a.zxf)
Values(b.xh,b.xm,b.zym,b.xb,b.cssj,b.zxf);
构建平台
-- 构建平台
create table PRODUCTS
(
PRODUCT_ID INTEGER,
PRODUCT_NAME VARCHAR2(60),
CATEGORY VARCHAR2(60)
);
create table NEWPRODUCTS
(
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;
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;
具体实现:
-- 具体实现:
begin
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;
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;
end;
说明:products为目标表,newproducts为源表,则若产品号相匹配,根据源表信息修改目标表的产品名(product_name)和产品类别(category)
merge into products p
using newproducts np
on (p.product_id=np.product_id)
when matched then
update set
p.product_name=np.product_name,
p.category=np.category;
说明:products为目标表,newproducts为源表,则若产品号不匹配,则根据源表将新的纪录添加到目标表。
Merge into products p
using newproducts np
on (p.product_id = np.product_id)
when not matched then
insert
values (np.product_id,np.product_name,
np.category);
-- 一个merge例子带update,delete 和insert 三种操作。
MERGE INTO products p
USING newproducts np
ON (p.product_id = np.product_id)
WHEN MATCHED THEN
UPDATE
SET p.product_name = np.product_name,
p.category = np.category
DELETE WHERE (p.category = 'ELECTRNCS')
WHEN NOT MATCHED THEN
INSERT
VALUES (np.product_id, np.product_name, np.category)
导入xskc.dmp文件:
输入命令:
SQL> $imp system/test tables=(xs,kc,xs_kc) file=C:\xskc.dmp
测试是否成功:
输入查询语句:
SQL> select * from xs;