我在 Oracle 中有一個資料表,其中包含以下列:
Record_ID, Run_ID, PO_Type, PO_NUM, DateTime
創建采購訂單時,所有列都將被填充,除了Run_ID:
Record_ID, Run_ID, PO_Type, PO_Num, DateTime
---------------------------------------------------
1374, , NEW_PO , 12345 , 20211117123456
1375, , NEW_PO , 12346 , 20211117123545
這些記錄目前通過 SSIS 從我們的系統中匯出,然后匯入到 SQL Server 資料庫中。這是他們將被分配的地方RUN_ID,這對于匯出的所有資料運行都是唯一的(一次匯出的所有內容都將具有相同的Run_ID):
RECORDID, SYSTEM, RUN_ID, PO_TYPE, PO_NUM, DATETIME
---------------------------------------------------------
1374, ORDER , 5078 , NEW_PO , 12345 , 20211117123456
1375, ORDER , 5078 , NEW_PO , 12346 , 20211117123545
然后我需要將這個寫回 Oracle 資料庫Run_ID并更新PO_TYPEfromNEW_PO到Processed_PO這樣我的 Oracle 資料庫看起來像這樣:
Record_ID, Run_ID, PO_Type , PO_Num, DateTime
--------------------------------------------------------
1374, 5078 , Processed_PO , 12345 , 20211117123456
1375, 5078 , Processed_PO , 12346 , 20211117123545
我遇到的問題是,這一切都需要在同一個 SSIS pull 中發生,因為它是我唯一可用的工具,而且我不知道如何開始解決這個問題,所以對此的任何建議都是不勝感激。
uj5u.com熱心網友回復:
鑒于您提供的有用的附加資訊,我現在了解到您的擔憂主要圍繞確保只有您提取的行是您稍后使用 RUN_ID 更新的行。
我認為這樣做的最簡單方法是使用 PO_TYPE 列并引入諸如“PO_Processing”之類的新狀態。我不知道您的環境/資料模型,因此這可能可行,也可能不可行-也許您對可以在此處輸入的內容有限制-但是 SSIS 包步驟將如下所示:
- 更新您想要的 Oracle 行
update oracle_table set po_type = 'In_Transit_PO' where <your criteria>
- 使用此狀態作為選擇標準執行提取
- 將資料加載到 SQL Server
- 將新的 RUN_ID 存盤在包中的用戶變數中
- 使用用戶變數更新 SQL Server 行
update SQL_PO set Run_ID = (?) where <your criteria> ('?' maps to your defined package variable)
- 更新 RUN_ID_TRACKER 以增加下一個 RUN_ID
- 使用用戶變數通過映射來更新 Oracle 行(具體語法可能略有不同,具體取決于您的包配置為使用的提供程式)
update oracle_table set PO_Type = 'Processed_PO', RUN_ID='?' where PO_Type = 'In_Transit_PO'
通過這種方式,您允許在負載運行時在 Oracle 端生成新的 PO,但您確保只有您提取的行是您使用 RUN_ID 更新的行。包中有幾個額外的步驟,但每個步驟都非常簡單。不僅如此,如果程序中出現錯誤,您可以準確記錄它正在嘗試處理的記錄子集,從而使除錯更容易。
想想看,您可以通過獲取 run_id 值并將其放入加載步驟之前的變數來稍微減少步驟,然后在插入行時您已經擁有要包含的值 - 無需二次更新SQL_PO 表。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361916.html
標籤:sql-server 甲骨文 姐姐
上一篇:使用ALTERTABLE陳述句添加NOTNULL約束(Oracle)
下一篇:將日期變數傳遞給sql動態陳述句
