java动态更新sql脚本
我正在研究需求,在那里我必须运行sql脚本。但sql脚本的行为是非常动态的,因为源表(DOD.PRODUCTS)具有动态模式。所以,当我将其合并到目标(BOB.PRODUCTS)中时,如果源代码中有一个或多个额外的列,那么下面的脚本也应该用新的列更新
我正在寻找一种方法,这样,如果新列到达源代码中,那么我如何才能以最有效的方式在所有地方为下面的脚本中的新列添加条目。我的想法是寻找每个需要添加列名的位置,比如where子句、INSERT、VALUES等。但我不喜欢这种方法,因为它的代码非常苛刻
我能知道更新这个脚本的有效方法吗?我能管理的代码,我只是在寻找创意
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) 个答案