хорошо, я попытаюсь заняться этим без вашей спецификации pl / sql, но посмотрим, как это работает.
Я буду использовать пример, предоставленный в установке ODP @% ORA_HOME% \ odp.net \ samples \ 2.x \ AssocArray \ AssocArray.sln
как образец для разговора.
но этот сайт тоже полезен
Использование ассоциативных массивов PL / SQL (на самом деле это не ссылка на статью, предоставленную mservidio, тогда как эта статья была о ArrayBind не Ассоциативные массивы )
CREATE TABLE TestAssociativeArray(COL1 varchar2(20), COL2 varchar2(20)) ;
/
create or replace PACKAGE MyTestAssociativeArray AS
TYPE AssocArrayVarchar2_t is table of VARCHAR(20) index by BINARY_INTEGER;
PROCEDURE TestVarchar2(Param1 IN TestAssociativeArray.COL1%type ,
Param2 IN AssocArrayVarchar2_t);
END MyTestAssociativeArray ;
/
create or replace package body MyTestAssociativeArray as
PROCEDURE TestVarchar2(Param1 IN TestAssociativeArray.COL1%type ,
Param2 IN AssocArrayVarchar2_t)
AS
i INTEGER ;
BEGIN
FOR i in Param2.first..Param2.last LOOP
insert into TestAssociativeArray(col1, col2)
values (Param1 , Param2(i)) ;
END LOOP ;
END TestVarchar2 ;
END MyTestAssociativeArray ;
/
теперь для .net кода:
static void Main(string[] args)
{
// Connect
string connectStr = getConnection();
// Setup the Tables for sample
OracleConnection connection = new OracleConnection(connectStr);
OracleCommand cmd = new OracleCommand("MyTestAssociativeArray.TestVarchar2", connection);
cmd.CommandType = CommandType.StoredProcedure ;
OracleParameter param1 = cmd.Parameters.Add("param1", OracleDbType.Varchar2);
OracleParameter param2 = cmd.Parameters.Add("param2", OracleDbType.Varchar2);
// Setup the direction
param1.Direction = ParameterDirection.Input;
param2.Direction = ParameterDirection.Input;
// Specify that we are binding PL/SQL Associative Array
param2.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
param1.Value = "ConstantValue" ;
param2.Value = new string[3]{"Val1",
"Val2",
"Val3"};
try
{
connection.Open();
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
и результаты (с очисткой)
select * from TestAssociativeArray
/
COL1 COL2
-------------------- --------------------
ConstantValue Val1
ConstantValue Val2
ConstantValue Val3
/** --clean up
drop package MyTestAssociativeArray;
drop table TestAssociativeArray ;
**/
Однако, так как вы не опубликовали свою спецификацию, это может быть что-то простое:
нуждаясь:
cmd.BindByName = true;
, поскольку ODP по умолчанию связывается по позиции, а не по имени (это сбивает с толку многих людей)