1)sql merge example01
1@@@@loading the dimensions using sql merge
@@@
@@@<1>create customer table.
@@@
[oracle@station78 ~]$ cat create_customer.sql
CREATE TABLE dw.customer
(CUSTOMER_ID VARCHAR2(10),
GENDER VARCHAR2(1),
TAX_RATE NUMBER,
CITY VARCHAR2(15),
STATE VARCHAR2(10),
REGION VARCHAR2(15),
POSTAL_CODE VARCHAR2(10),
COUNTRY VARCHAR2(20),
OCCUPATION VARCHAR2(15)
)
tablespace users;
@@@
[oracle@station78 ~]$ cat insert_customer.sql
INSERT INTO dw.customer VALUES
('AB123459', 'M', 5, 'Phoenix', 'AZ', 'AmerWest', '85001', 'USA', 'Astor-Physicist');
INSERT INTO dw.customer VALUES
('AB123460', 'F', 15, 'London', 'London', 'EuroWest', 'W1-2BA', 'UK', 'Engineer');
COMMIT;
@@@
SYS@ocp> @create_customer.sql
Table created.
SYS@ocp> @insert_customer.sql
1 row created.
1 row created.
Commit complete.
SYS@ocp> select count(*) from dw.customer;
COUNT(*)
----------
2
@@@
@@@<2>create external customer change table to dw user.
@@@
[oracle@station78 datafiles]$ cat customer_changes.dat
'AB123459', 'M', 5, 'Phoenix', 'AZ', 'AmerWest', '85001', 'USA', 'Astor-Physicist'
'AB123460', 'F', 15, 'London', 'London', 'EuroWest', 'W1-2BA', 'UK', 'Engineer'
'AB114778', 'M', 40, 'Reading', 'Berkshire', 'EuroWest', 'RG1 1BB', 'UK', 'Astronomer'
'AB123478', 'F', 25, 'Camberley', 'Surrey', 'EuroWest', 'GU14 2DR', 'UK', 'DB Consultant'
@@@
[oracle@station78 ~]$ cat external_customer_changes.sql
CREATE TABLE dw.customer_changes
(customer_id VARCHAR2(10),
gender VARCHAR2(1),
tax_rate NUMBER,
city VARCHAR2(15),
state VARCHAR2(10),
region VARCHAR2(15),
postal_code VARCHAR2(10),
country VARCHAR2(20),
occupation VARCHAR2(15))
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_file_dir
ACCESS PARAMETERS
(records delimited by newline
characterset us7ascii
badfile log_file_dir:'cust_changes.bad'
logfile log_file_dir:'cust_changes.log'
fields terminated by ','
optionally enclosed by "'")
LOCATION ('customer_changes.dat')
)
REJECT LIMIT UNLIMITED NOPARALLEL;
@@@
SYS@ocp> @external_customer_changes.sql
Table created.
@@@
SYS@ocp> select count(*) from dw.customer_changes;
COUNT(*)
----------
4
@@@
@@@<3>merge customer_changes table and customer table.
@@@
@@@all the changed table of customer would apply into customer.
@@@this is a good method to synchronize the data between table in different databases.
[oracle@station78 ~]$ cat merge01.sql
MERGE INTO dw.customer c
USING dw.customer_changes cc
ON (c.customer_id=cc.customer_id)
WHEN MATCHED THEN
UPDATE SET
c.city=cc.city,
c.state=cc.state,
c.postal_code=cc.postal_code,
c.gender=cc.gender,
c.country=cc.country,
c.region=cc.region,
c.tax_rate=cc.tax_rate,
c.occupation=cc.occupation
WHEN NOT MATCHED THEN
INSERT
(customer_id, city, state, postal_code, gender, region,
country, tax_rate, occupation)
VALUES
(cc.customer_id, cc.city, cc.state, cc.postal_code,
cc.gender, cc.region, cc.country, cc.tax_rate,
cc.occupation);
@@@
SYS@ocp> @merge01.sql
4 rows merged.
SYS@ocp> select count(*) from dw.customer;
COUNT(*)
----------
4
@@@
@@@supplement: if target table is read only, you could change code like:
MERGE INTO dw.customer c
USING dw.customer_changes cc
ON (c.customer_id=cc.customer_id)
WHEN MATCHED THEN
WHEN NOT MATCHED THEN
INSERT
(customer_id, city, state, postal_code, gender, region,
country, tax_rate, occupation)
VALUES
(cc.customer_id, cc.city, cc.state, cc.postal_code,
cc.gender, cc.region, cc.country, cc.tax_rate,
cc.occupation);
@@@
@@@<4>add the delete clause.
@@@
[oracle@station78 ~]$ cat merge02.sql
MERGE INTO dw.customer c
USING dw.customer_changes cc
ON (c.customer_id=cc.customer_id)
WHEN MATCHED THEN
UPDATE SET
c.city=cc.city,
c.state=cc.state,
c.postal_code=cc.postal_code,
c.gender=cc.gender,
c.country=cc.country,
c.region=cc.region,
c.tax_rate=cc.tax_rate,
c.occupation=cc.occupation
DELETE WHERE(c.tax_rate=5) @@@<==it is work to customer
WHEN NOT MATCHED THEN
INSERT
(customer_id, city, state, postal_code, gender, region,
country, tax_rate, occupation)
VALUES
(cc.customer_id, cc.city, cc.state, cc.postal_code,
cc.gender, cc.region, cc.country, cc.tax_rate,
cc.occupation);
@@@
SYS@ocp> @merge02.sql
4 rows merged.
SYS@ocp> select count(*) from dw.customer;
COUNT(*)
----------
3