我在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,且未设置结果,则任务将运行。我尚不知道是否可以访问返回值,但是没有错误,因此可以解决。
答案 0 :(得分:2)
LONG
在Oracle中不是数字类型-它是不赞成使用的LOB。在Oracle中,您应该使用NUMBER类型来存储数字值。 NUMBER是用于存储精度为38位的以10为底的浮点值的基本数据类型,因此不会遇到无法用例如数字表示的值(例如0.1)的问题。 IEEE-754二进制浮点值。在SSIS方面,这将分别对应于DOUBLE,INT,DECIMAL等,即所有数字类型。