代码之家  ›  专栏  ›  技术社区  ›  thursdaysgeek

从SSIS Execute SQL任务返回Oracle LONG值

  •  2
  • thursdaysgeek  · 技术社区  · 6 年前

    我在Oracle中有一个过程,它接受varchar2作为输入并返回long。

    我想从SSIS运行该过程,然后在后续SSIS步骤中使用该值。

    我有一个序列容器,所以一旦我收到结果,我就可以使用它。但我没能按程序进行。我尝试过各种各样的事情,总是会出错。

    以下是我所拥有的:

    在Oracle中,我的过程(它不是我的,所以我不能更改它)定义为

    P_CREATE_BATCH (V_NAME IN VARCHAR2, V_BATCH OUT LONG)
    

    在SSIS中,我有一个名为v_batch的变量,它是Int32,值为0。 我还有一个执行SQL任务。它与Oracle数据库有一个OLE连接。SourceType是直接输入,ResultSet是单行,我的SQL查询是

    BEGIN
      P_CREATE_BATCH ('FACT_METER',?);
    END;
    

    我有来自user::v_batch的参数映射,方向输出,数据类型LONG,参数0。 我有一个名为MyBatch的结果名,变量名为User::v_batch。

    当我运行它时,我得到错误:

    [执行SQL任务]错误:执行查询“BEGIN P_CREATE_BATCH” (“事实米”?);END;”失败,错误如下:“ORA-06550: 第1行第7列:PLS-00306:中的参数数目或类型错误 调用“P_CREATE_BATCH”ORA-06550:line 1,column 7:PL/SQL: 语句被忽略”。可能的失败原因:查询有问题, “ResultSet”属性设置不正确,参数设置不正确, 或连接未正确建立。

    我已经用at数据类型为Int64的变量进行了尝试。我试过没有结果集。我忘了我试过多少种不同的排列方式。有时我会犯不同的错误,但这是因为我在尝试一些明显错误的东西。

    如何成功调用返回LONG的Oracle过程,并在SSIS中获取该值?

    更新,基于注释: 写入(在Oracle中)的基础表的数据类型为数字(18)。我制作了一个Oracle过程的版本,它返回数字,而不是LONG。

    当我调用它时,它仍然会给我一个错误,我认为这是因为我需要一个不同类型的SSIS变量。过程确实运行,然后返回错误

    [执行SQL任务]错误:执行查询“BEGIN” P_CREATE_BATCHK('事实计量器',?); END;”失败,错误如下:“ORA-06502:PL/SQL:numeric or value error:character string buffer too small ORA-06512:在1号线。可能的失败原因:查询出现问题,“ResultSet”属性设置不正确、参数设置不正确或连接建立不正确。

    我的参数是数据类型NUMERIC,变量是Int32,然后是Int64,然后是Double,然后是UInt64,最后是Decimal。剩下的选择不多了。

    更新 如果我的SSIS变量为Double,参数数据类型为Double,并且没有结果集,则任务将运行。我还不知道是否可以访问返回值,但没有错误,所以这是一个过程。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bob Jarvis - Слава Україні    6 年前

    LONG 不是Oracle中的数字类型-它是不推荐使用的LOB类型。在Oracle中,应该使用类型号来存储数值。数字是基本数据类型,用于存储精度为38位的基数10浮点值,因此不存在不能用IEEE-754二进制浮点值表示的值(例如0.1)的问题。在SSIS端,这将对应于DOUBLE、INT、DECIMAL等各种类型,即所有的数字类型。