动态更新sql脚本

时间:2018-02-28 08:09:17

标签: java

我正在处理需求,我必须运行sql脚本。但是sql脚本的行为非常动态,因为源表(DOD.PRODUCTS)具有动态模式。因此,当我将一个或多个额外列放入源中的情况下将其合并到目标(BOB.PRODUCTS)中时,下面的脚本也应该使用新列进行更新。

我正在寻找一种方法,以便如果新列到达源代码,那么如何以最有效的方式在所有地方的下一个脚本中添加该新列的条目。我的想法只是寻找需要添加列名的每个位置,例如where子句,INSERT,VALUES等。但是我不满意这种方法,因为它的goona是非常苛刻的代码。

我是否知道更新此脚本的任何有效想法?代码我可以管理,我只是在寻找IDEA

MERGE INTO BOB.PRODUCTS GCA
        USING (SELECT * FROM DOD.PRODUCTS) SCA
        ON (SCA.CCOA_ID=GCA.CCOA_ID)
WHEN MATCHED THEN UPDATE SET
        GCA.EFTV_TO=SYSDATE-1
        ,GCA.ROW_WRITTEN=CURRENT_TIMESTAMP
    WHERE (GCA.EFTV_TO IS NULL)
        AND(NVL(GCA.DESCR,'NULL')<>NVL(SCA.DESCR,'NULL')
        OR NVL(GCA.SHORT_DESCR,'NULL')<>NVL(SCA.SHORT_DESCR,'NULL')
        OR NVL(GCA.FREE_FRMT,'NULL')<>NVL(SCA.FREE_FRMT,'NULL')
        OR NVL(GCA.CCOI_ATT,'NULL')<>NVL(SCA.CCOI_ATT,'NULL'))
    WHEN NOT MATCHED THEN
        INSERT(CCOA_ID, DESCR, SHORT_DESCR, FREE_FRMT, CCOI_ATT, EFTV_FROM, EFTV_TO, ROW_WRITTEN
        )
        VALUES(SCA.CCOA_ID, SCA.DESCR, SCA.SHORT_DESCR, SCA.FREE_FRMT, SCA.CCOI_ATT, SYSDATE, NULL, CURRENT_TIMESTAMP
        );


INSERT INTO 
    BOB.PRODUCTS GCA(GCA.CCOA_ID, GCA.DESCR, GCA.SHORT_DESCR, GCA.FREE_FRMT, GCA.CCOI_ATT, GCA.EFTV_FROM, GCA.EFTV_TO, GCA.ROW_WRITTEN
    )
    SELECT SCA.CCOA_ID, SCA.DESCR, SCA.SHORT_DESCR, SCA.FREE_FRMT, SCA.CCOI_ATT, SYSDATE, NULL, CURRENT_TIMESTAMP
 FROM DOD.PRODUCTS SCA 
LEFT OUTER JOIN BOB.PRODUCTS GCA
ON NVL(SCA.CCOA_ID,'NULL')=NVL(GCA.CCOA_ID,'NULL')
    AND NVL(SCA.DESCR,'NULL')=NVL(GCA.DESCR,'NULL')
    AND NVL(SCA.SHORT_DESCR,'NULL')=NVL(GCA.SHORT_DESCR,'NULL')
    AND NVL(SCA.FREE_FRMT,'NULL')=NVL(GCA.FREE_FRMT,'NULL')
    AND NVL(SCA.CCOI_ATT,'NULL')=NVL(GCA.CCOI_ATT,'NULL')
WHERE NVL(SCA.DESCR,'NULL')<>NVL(GCA.DESCR,'NULL')
    OR NVL(SCA.SHORT_DESCR,'NULL')<>NVL(GCA.SHORT_DESCR,'NULL')
    OR NVL(SCA.FREE_FRMT,'NULL')<>NVL(GCA.FREE_FRMT,'NULL')
    OR NVL(SCA.CCOI_ATT,'NULL')<>NVL(GCA.CCOI_ATT,'NULL');

0 个答案:

没有答案