天天看點

簡化SQL計算之編寫動态MERGE語句

         MSSQL,ORACLE等資料庫支援MERGE語句更新表,但表結構未知時,由于缺乏集合類資料,用存儲過程獲得表結構再動态拼出SQL非常麻煩,代碼會有幾十行之多;同樣原因,用Java等進階語言實作也不簡單。而且使用存儲過程或Java程式需要代碼将内置于資料庫或應用程式中,更新管理較為麻煩。這時候可用集算器來協助處理,代碼可置于資料庫和應用程式之外,不影響資料庫與應用程式的結構,易于維護。

         參數source和target代表兩個結構相同但資料不同的表,要求以主鍵為标準用source更新target,比如table1和table2的主鍵都是A和B,資料如下:

簡化SQL計算之編寫動态MERGE語句

         用table2更新table1時,MERGE語句應當如下:

MERGE INTO table1 as t
USING table2 as s
ON t.A=s.A and t.B=s.B
WHEN MATCHED
THEN UPDATE SET t.C=s.C,t.D=s.D
WHEN NOT MATCHED
THEN INSERT VALUES(s.A,s.B,s.C,s.D)
           

         更新後table1應當如下:

簡化SQL計算之編寫動态MERGE語句

   集算器代碼:

簡化SQL計算之編寫動态MERGE語句

        A1,A2: 從系統表中讀出表source的主鍵存入變量pks,計算結果為集合[”A”,”B”]。各種資料庫獲得主鍵的方法不同,這裡以MSSQL為例。

        A3,A4:讀出source的完整字段,columns的計算結果為[”A”,”B”,”C”,”D”]。

        A5:動态生成MERGE語句。pks.(…)是循環函數,可對集合(包括結果集)的成員依次計算,計算中可用~引用循環變量,用#引用循環計數。

        A6:執行MERGE語句。