从SSIS执行SQL任务

时间:2018-08-06 16:00:15

标签: oracle oracle11g ssis ssis-2012

我在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是Single行,而我的SQL查询是

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

我有来自用户的参数映射:: v_batch,方向为Output,数据类型为LONG,参数0。 我有一个名为MyBatch的结果名称,其变量名称为User :: v_batch。

当我运行它时,出现错误:

  

[执行SQL任务]错误:执行查询“ BEGIN P_CREATE_BATCH   ('FACT_METER',?); END;”失败,并出现以下错误:“ ORA-06550:   第1行,第7列:PLS-00306:错误的参数编号或类型   调用“ P_CREATE_BATCH” ORA-06550:第1行,第7列:PL / SQL:   语句已忽略”。可能的失败原因:查询问题,   “ ResultSet”属性设置不正确,参数设置不正确,   或连接建立不正确。

我用变量类型为Int64的变量进行了尝试。我尝试了没有结果集。我已经忘记尝试了多少种不同的排列方式。有时我会得到一个不同的错误,但这是因为我正在尝试明显错误的操作。

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

根据评论进行更新: (在Oracle中)写入的基础表的数据类型为number(18)。我制作了一个返回NUMBER而不是LONG的Oracle过程版本。

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

  

[执行SQL任务]错误:执行查询“ BEGIN   P_CREATE_BATCHK('FACT_METER',?);   END;”失败,并出现以下错误:“ ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小   ORA-06512:在第1行。”可能的失败原因:查询问题,“ ResultSet”属性未正确设置,参数未正确设置或连接未正确建立。

我的参数为数据类型NUMERIC,变量为Int32,然后是Int64,然后是Double,然后是UInt64,然后是十进制。没有太多选择了。

更新 如果我的SSIS变量为Double,参数数据类型为Double,且未设置结果,则任务将运行。我尚不知道是否可以访问返回值,但是没有错误,因此可以解决。

1 个答案:

答案 0 :(得分:2)

LONG在Oracle中不是数字类型-它是不赞成使用的LOB。在Oracle中,您应该使用NUMBER类型来存储数字值。 NUMBER是用于存储精度为38位的以10为底的浮点值的基本数据类型,因此不会遇到无法用例如数字表示的值(例如0.1)的问题。 IEEE-754二进制浮点值。在SSIS方面,这将分别对应于DOUBLE,INT,DECIMAL等,即所有数字类型。