--2020.03.26:oracle没有NOT MATCHED BY SOURCE 语法,但是可以在match的条件里删除,
MERGE INTO AIMS_ACCOUNT_ATTR T
USING (SELECT AA.ACCOUNTID ACCOUNTID,
GCD42.V_45 ACCOUNTNO,
1 IS_LAW_PERMEATION
FROM GDT_CUST_GDTCLMS42 GCD42
JOIN AIMS_ACCOUNT AA ON AA.ACCOUNTNO = GCD42.V_45) GDT
ON (GDT.ACCOUNTID = T.ACCOUNTID)
WHEN MATCHED THEN
UPDATE SET T.IS_LAW_PERMEATION = GDT.IS_LAW_PERMEATION
DELETE WHERE GDT.ACCOUNTID = T.ACCOUNTID
WHEN NOT MATCHED THEN
INSERT
(ID, ACCOUNTID, ACCOUNTNO, IS_LAW_PERMEATION)
VALUES (AIMS_ACCOUNT_ATTR_SEQ.NEXTVAL, GDT.ACCOUNTID, GDT.ACCOUNTNO, 1)
这种局限性也比较大,可以考虑在using的表上处理
看一个案例:
我有一个账户表 aims_account ,融资信息子表 GDT_CUST_GDTCLMS42 ,账户信息子表
现在要把GDT_CUST_GDTCLMS42 里面的帐号同步到账户子表aims_account_attr,
因为aims_account_attr还有其他信息所以尽量不能删除,如果GDT_CUST_GDTCLMS42里面的账户被删除了,就把aims_account_attr表的一个字段的值改为0
MERGE INTO AIMS_ACCOUNT_ATTR T
USING (
SELECT AAA.ACCOUNTID ACCOUNTID,AAA.ACCOUNTNO ACCOUNTNO,0 IS_LAW_PERMEATION FROM AIMS_ACCOUNT_ATTR AAA WHERE NOT EXISTS (SELECT 1 FROM GDT_CUST_GDTCLMS42 GDT42 WHERE GDT42.V_45 = AAA.ACCOUNTNO)
UNION
SELECT AA.ACCOUNTID ACCOUNTID, AA.ACCOUNTNO ACCOUNTNO, 1 IS_LAW_PERMEATION FROM GDT_CUST_GDTCLMS42 GDT42 JOIN AIMS_ACCOUNT AA ON AA.ACCOUNTNO = GDT42.V_45
) GDT
ON (GDT.ACCOUNTID = T.ACCOUNTID)
WHEN MATCHED THEN
UPDATE
SET T.IS_LAW_PERMEATION = GDT.IS_LAW_PERMEATION
WHEN NOT MATCHED THEN
INSERT
(ID, ACCOUNTID, ACCOUNTNO, IS_LAW_PERMEATION)
VALUES
(AIMS_ACCOUNT_ATTR_SEQ.NEXTVAL, GDT.ACCOUNTID, GDT.ACCOUNTNO, GDT.IS_LAW_PERMEATION)
使用环境IBATIS + ORACLE
页面:
建表语句:
--序列
DECLARE
CNT INTEGER;
BEGIN
SELECT COUNT(0) INTO CNT FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = UPPER('SEQ_AIMS_FILE_CONTROL');
IF CNT = 0 THEN
EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_AIMS_FILE_CONTROL
MINVALUE 1
MAXVALUE 9999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20';
END IF;
END;
/
--表
DECLARE
CNT INTEGER;
BEGIN
SELECT COUNT(0) INTO CNT FROM USER_ALL_TABLES
WHERE TABLE_NAME = UPPER('AIMS_FILE_CONTROL');
IF CNT = 0 THEN
EXECUTE IMMEDIATE 'CREATE TABLE AIMS_FILE_CONTROL(
CONTROL_ID NUMBER,
ATTNO VARCHAR2(32),
CREATE_PERSON VARCHAR2(32),
CREATE_TIME DATE,
UPDATE_PERSON VARCHAR2(32),
UPDATE_TIME DATE,
ACCOUNT_APPLY VARCHAR2(32),
ACCOUNT_REGIST VARCHAR2(32),
ACCOUNT_CHANGE_APPLY VARCHAR2(32),
ACCOUNT_CHANGE_REGIST VARCHAR2(32),
ACCOUNT_REVISE VARCHAR2(32),
ACCOUNT_CANCEL_APPLY VARCHAR2(32),
ACCOUNT_CANCEL_REGIST VARCHAR2(32),
EBANK_APPLY VAR