在 SQL 服务器中将值分配给类似列后,使用 SSIS 将 Oracle table 列更新为 Null
USE SSIS to update Oracle table column with Null after the value has been assigned in SQL Server to a similar column
我在 Oracle 中有一个数据 table,其中包含以下列:
Record_ID, Run_ID, PO_Type, PO_NUM, DateTime
创建 PO 时,所有列都会被填充,除了 Run_ID
:
Record_ID, Run_ID, PO_Type, PO_Num, DateTime
---------------------------------------------------
1374, , NEW_PO , 12345 , 20211117123456
1375, , NEW_PO , 12346 , 20211117123545
这些记录目前通过 SSIS 从我们的系统中导出,然后导入到 SQL 服务器数据库中。这是他们将被分配一个 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
然后我需要将此 Run_ID
写回 Oracle 数据库并将 PO_TYPE
从 NEW_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 中发生,因为它是我唯一可用的工具,而且我不知道如何开始解决这个问题,所以任何对此的建议将不胜感激。
根据您提供的有用的附加信息,我现在了解到您主要关心的是确保只有您提取的行是您稍后使用 RUN_ID 更新的行。
我能看到的最简单的方法是使用 PO_TYPE 列并引入一个新状态,例如 'PO_Processing'。我不知道你的环境/数据模型,所以这可能可行,也可能不可行 - 也许你对可以在此处输入的内容有限制 - 但 SSIS 包步骤将如下所示:
- 更新您想要的 Oracle 行
update oracle_table set po_type = 'In_Transit_PO' where <your criteria>
- 使用此状态作为选择标准执行提取
- 将数据加载到SQL服务器
- 将新的 RUN_ID 存储在包中的用户变量中
- 使用用户变量更新 SQL 服务器行
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 端生成新的采购订单,但您可以确保只有您提取的行是您使用 RUN_ID.包装中有几个额外的步骤,但每个步骤都非常简单。不仅如此,如果过程中出现错误,您还可以准确记录它正在尝试处理的记录子集,从而使调试更容易。
想想看,您可以通过获取 run_id 值并将其放入变量 before 来减少步骤,然后您已经具有插入行时要包含的值 - 无需对 SQL_PO table.
进行二次更新
我在 Oracle 中有一个数据 table,其中包含以下列:
Record_ID, Run_ID, PO_Type, PO_NUM, DateTime
创建 PO 时,所有列都会被填充,除了 Run_ID
:
Record_ID, Run_ID, PO_Type, PO_Num, DateTime
---------------------------------------------------
1374, , NEW_PO , 12345 , 20211117123456
1375, , NEW_PO , 12346 , 20211117123545
这些记录目前通过 SSIS 从我们的系统中导出,然后导入到 SQL 服务器数据库中。这是他们将被分配一个 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
然后我需要将此 Run_ID
写回 Oracle 数据库并将 PO_TYPE
从 NEW_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 中发生,因为它是我唯一可用的工具,而且我不知道如何开始解决这个问题,所以任何对此的建议将不胜感激。
根据您提供的有用的附加信息,我现在了解到您主要关心的是确保只有您提取的行是您稍后使用 RUN_ID 更新的行。
我能看到的最简单的方法是使用 PO_TYPE 列并引入一个新状态,例如 'PO_Processing'。我不知道你的环境/数据模型,所以这可能可行,也可能不可行 - 也许你对可以在此处输入的内容有限制 - 但 SSIS 包步骤将如下所示:
- 更新您想要的 Oracle 行
update oracle_table set po_type = 'In_Transit_PO' where <your criteria>
- 使用此状态作为选择标准执行提取
- 将数据加载到SQL服务器
- 将新的 RUN_ID 存储在包中的用户变量中
- 使用用户变量更新 SQL 服务器行
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 端生成新的采购订单,但您可以确保只有您提取的行是您使用 RUN_ID.包装中有几个额外的步骤,但每个步骤都非常简单。不仅如此,如果过程中出现错误,您还可以准确记录它正在尝试处理的记录子集,从而使调试更容易。
想想看,您可以通过获取 run_id 值并将其放入变量 before 来减少步骤,然后您已经具有插入行时要包含的值 - 无需对 SQL_PO table.
进行二次更新