在 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_TYPENEW_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 包步骤将如下所示:

  1. 更新您想要的 Oracle 行

update oracle_table set po_type = 'In_Transit_PO' where <your criteria>

  1. 使用此状态作为选择标准执行提取
  2. 将数据加载到SQL服务器
  3. 将新的 RUN_ID 存储在包中的用户变量中
  4. 使用用户变量更新 SQL 服务器行

update SQL_PO set Run_ID = (?) where <your criteria> ('?' maps to your defined package variable)

  1. 更新 RUN_ID_TRACKER 以增加下一个 RUN_ID
  2. 使用用户变量通过映射来更新 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.

进行二次更新