通过Oracle.ManagedDataAccess.dll将变量中的对象数组传递给存储过程
Pass an array of objects in a variable to a stored procedure through Oracle.ManagedDataAccess.dll
使用最新的 Oracle 托管驱动程序,不支持 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,但对我不起作用。遇到同样的异常。
我认为你必须使用 "Associative array" 而不是 "Nested table"。
而不是
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
不起作用)。您必须在包中定义关联数组,如果需要,也许您必须将其转换为嵌套 table。
使用最新的 Oracle 托管驱动程序,不支持 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,但对我不起作用。遇到同样的异常。
我认为你必须使用 "Associative array" 而不是 "Nested table"。
而不是
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
不起作用)。您必须在包中定义关联数组,如果需要,也许您必须将其转换为嵌套 table。