【最佳实践】Merge Into 批量新增并修改删除数据

本文围绕Oracle数据库展开,讲述在IBATIS + ORACLE环境下,将融资信息子表GDT_CUST_GDTCLMS42的帐号同步到账户子表aims_account_attr的问题。指出原写法不能批量操作的局限,给出改进的批量新增或修改方法,还提及使用中需注意的类型匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值