通过Oracle.ManagedDataAccess.dll将变量中的对象数组传递给存储过程

时间:2017-06-30 06:55:34

标签: oracle stored-procedures oracle-manageddataaccess

使用最新的Oracle Managed驱动程序,不支持Oracle.DataAccess.Types.OracleUdt和OracleDbType.Array 我想传递一个整数数组并从存储过程中检索相应的数据。

List<OracleParameter> lstParams = new List<OracleParameter>()
new OracleParameter(){ParameterName = "PARAM1", Value = new Int32[]{1,2,3}, Direction = ParameterDirection.Input, CollectionType = OracleCollectionType.PLSQLAssociativeArray, Size = 3},
new OracleParameter(){ParameterName = "OUT_CUR", Value = null, OracleDbType = OracleDbType.RefCursor, Direction = ParameterDirection.Output}
};

using (OracleCommand cmd = new OracleCommand() { CommandText = "MANAGED_DEMO_TEST", Connection = OracleConnectionFactory.GetInstance(), CommandType = System.Data.CommandType.StoredProcedure})
{
cmd.Parameters.AddRange(lstParams.ToArray());
//Getting exception at this line
reader = cmd.ExecuteReader();
}

在Oracle中,我正在创建一个自定义类型并在过程中使用它。

CREATE OR REPLACE TYPE CUSTOM_ID IS TABLE OF NUMBER;
create or replace PROCEDURE MANAGED_DEMO_TEST(
PARAM1 IN CUSTOM_ID,
OUT_CUR out sys_refcursor
) 
AS BEGIN
open out_cur for
--Random select statement to test the execution of SP
SELECT * from my_table where id = 1;
END;

目前我收到一个例外:PLS-00306:调用'MANAGED_DEMO_TEST'时参数的数量或类型错误

主要目的是将一组自定义类型对象传递给存储过程。 我试过了this solution,但对我没用。得到了同样的例外。

1 个答案:

答案 0 :(得分:0)

我认为你必须使用“关联数组”而不是“嵌套表”。

而不是

CREATE OR REPLACE TYPE CUSTOM_ID IS TABLE OF NUMBER; 

你必须使用

TYPE CUSTOM_ID IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

但是,您无法创建关联数组作为架构对象(即CREATE OR REPLACE TYPE CUSTOM_ID IS TABLE OF NUMBER INDEX BY BINARY_INTEGER不起作用)。您必须在Package中定义Associative数组,如果需要,可能必须将其转换为嵌套表。