Você pode começar de (maneira mais simples):
List<int> idList = yourObjectList;
List<int> nameList = yourObjectList;
using (OracleConnection oraconn = new OracleConnection())
{
oraconn.ConnectionString = "Your_Connection_string";
using (OracleCommand oracmd = new OracleCommand())
{
oracmd.Connection = oraconn;
oracmd.CommandType = CommandType.StoredProcedure;
oracmd.CommandText = "Your_Procedura_name";
oraconn.Open();
// To use ArrayBinding, you need to set ArrayBindCount
oracmd.BindByName = true;
oracmd.ArrayBindCount = idList.Count;
// Instead of single values, we pass arrays of values as parameters
oracmd.Parameters.Add("ids", OracleDbType.Int32, oyourObjectList.ToArray(), ParameterDirection.Input);
oracmd.Parameters.Add("names", OracleDbType.Varchar2, oyourObjectList.ToArray(), ParameterDirection.Input);
oracmd.ExecuteNonQuery();
oraconn.Close();
}
}
Em seguida, adicione o pacote/procedimento no db:
PROCEDURE Your_Procedure_name(
name IN VARCHAR2,
id IN NUMBER
) IS
BEGIN
INSERT INTO your_table VALUES( id, name);
END Your_Procedure_name;
Outra opção é:
using (OracleConnection oraconn = new OracleConnection())
{
oraconn.ConnectionString = "Your_Connection_string";
using (OracleCommand cmd = new OracleCommand())
{
cmd.Connection = oraconn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Your_Procedure_name";
oraconn.Open();
OracleParameter idParam = new OracleParameter("i_idList", OracleDbType.Int32, ParameterDirection.Input);
idParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
idParam.Value = idList.ToArray();
idParam.Size = idList.Count;
OracleParameter nameParam = new OracleParameter("i_nameList", OracleDbType.Varchar2, ParameterDirection.Input);
nameParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
nameParam.Value = nameList.ToArray();
nameParam.Size = nameList.Count;
// You need this param for output
cmd.Parameters.Add("ret", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
cmd.Parameters.Add(idParam);
cmd.Parameters.Add(nameParam);
conn.Open();
//If you need to read results ...
using (OracleDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
...
}
}
conn.Close();
}
}
Mas é mais complicado, pois você precisa definir novos tipos para o procedimento armazenado, como
TYPE integer_list IS TABLE OF Your_table.id_column%TYPE INDEX BY BINARY_INTEGER;
// same for names
crie um tipo de nível de esquema como
create or replace TYPE T_ID_TABLE is table of number;
E, em seguida, use-os no procedimento armazenado, como
PROCEDURE Your_Procedure_name(
v_ret IN OUT SYS_REFCURSOR,
i_idList integer_list,
i_nameList string_list)
IS
begin
-- Store passed object id list to array
idList T_ID_TABLE := T_ID_TABLE();
...
begin
-- Store passed object id list to array
idList.Extend(i_idList.Count);
FOR i in i_idList.first..i_idList.last loop
idList(i) := i_idList(i);
END LOOP;
...
END Your_Procedure_name;