天天看點

簡化SQL計算之實作跨庫動态MERGE運算

        MSSQL,ORACLE等資料庫都有MERGE語句,用于更新表很友善。但源表和目标表來自不同資料庫時,就很難直接使用MERGE語句了。這時候,可以用集算器來協助處理。

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

簡化SQL計算之實作跨庫動态MERGE運算

         用table2更新table1之後,table1應當如下:

簡化SQL計算之實作跨庫動态MERGE運算

        集算器代碼:

簡化SQL計算之實作跨庫動态MERGE運算

        A1,A2:從系統表中讀出表source的主鍵存入變量pks,計算結果為”A,B”。各種資料庫獲得主鍵的方法不同,這裡以MSSQL為例。myDB2/myDB1分别指向source/target所在資料庫。

        A3,A4:以遊标的方式讀取source和target,後續的歸并運算要求歸并項(即主鍵)有序,故要排序。

        A5:将target和source進行左連結。@x表示操作遊标,@1表示左連接配接。${columns}是宏,可将字元串轉化為表達式。

        A6:從遊标A5中循環取數,每次一千條。在循環體B6-B9中可以用A6來引用循環變量。下圖是A6的結構:

簡化SQL計算之實作跨庫動态MERGE運算

        B6,B7:取出需要insert的記錄,并更新target。選項@i表示隻生成insert語句,不進行全表掃描。

        B8,B9:取出需要update的記錄,并更新target。選項@u表示隻生成update語句。函數array可以獲得字段名清單。

         循環結束後可以看到target(table1)已被更新:

簡化SQL計算之實作跨庫動态MERGE運算

         這個方法也可以應用于那些不支援MERGE語句的資料庫,如MySQL。