【问题标题】:Inserting data into an Oracle db using SSIS OLE DB Command使用 SSIS OLE DB 命令将数据插入 Oracle 数据库
【发布时间】:2014-08-02 19:10:51
【问题描述】:

我正在尝试从 SQL 源向 Oracle 目标执行插入和更新(当然是 2 个单独的流程)。我遵循了此链接中给出的过程: http://sqlblog.com/blogs/andy_leonard/archive/2007/07/09/ssis-design-pattern-incremental-loads.aspx

因为我的目标包含一个使用 Oracle 序列的列,所以我无法仅使用 OLE DB 目标或 Oracle 目标(attunity 驱动程序),因此我修改了新行路径(插入路径)以使用 OLE DB 命令并输入组件属性 SQL 命令中的以下 T-sql 语句:

insert into AWQMSO.FIRM (
FIRM_ID,
ACM_FIRM_ID,
MSTR_FIRM_ID,
ACTV_IND,
FIRM_STAT_TXT,
CRTE_BY_USR_ID,
CRTE_DTTM,
LST_UPDT_BY_USR_ID,
LST_UPDT_DTTM)
values (
FIRM_SEQ.Nextval,
?,
?,
?,
?,
?,
?,
?,
?)

包然后在 OLE DB 命令(插入)上失败,并显示一个相当无用的错误消息:

错误:数据流任务中的 0xC0202009,OLE DB 命令 1 [571]:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80040E55。

重复 152 次...应该插入目标表的确切行数。

但是,更新路径使用类似的 T-sql 语句可以正常工作(几乎...仍在与日期格式作斗争):

Update AWQMSO.FIRM
set
FIRM_STAT_TXT = ?
,ACTV_IND = ?
,LST_UPDT_BY_USR_ID = ?
where ACM_FIRM_ID = ?

我能看到的唯一区别是 .Nextval 的硬编码,所以我尝试创建一个包含“FIRM_SEQ.Nextval”而不带引号的派生列。将 FIRM_SEQ.Nextval 更改为 ?并将值映射到新派生的字段,这给了我一个信息更丰富的错误消息,即数据无法插入到 FIRM_ID 字段中,但仍然给我留下同样的问题。

我已成功使用执行 SQL 任务将单行插入到 Oracle 中的统计表中,其中包含使用变量和参数化查询的序列字段。那只是一行,虽然有 4 列,但我不知道如何重现相同类型的东西,将数据集的每一行放入一个变量中,然后执行插入并移动到下一行。

提前感谢您的帮助!

【问题讨论】:

  • 0x80040E55 是 DB_E_BADORDINAL 的 OLEDB 错误 - 指定的列不存在。 See the TechNet reference of OLEDB errors here。分享和享受。
  • 在执行类似于下面的脚本后,我们发现 DEV 框上的索引一直被破坏,所以上面的原始解决方案工作得很好。

标签: sql oracle ssis


【解决方案1】:

您可以添加一个脚本任务来增加数字并检查所需的格式。例如您可以先从序列中选择 nextval 并将其用作初始值。

在 oledb 目标(用于 oracle 表)中,您可以将公司 ID 映射到脚本任务的输出值。

要创建脚本任务,您可以使用如下代码:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    int i;
    public override void PreExecute()
    {
        base.PreExecute();
        i = 0; //************initialize this to the nextval sequence value
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        i++;
        Row.FirmID = i;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多