Você não poderá fazer isso facilmente com o System.Data.OracleClient obsoleto mas você pode utilizar o ODP do oracle com o uso de UDTs. Se isso não for uma opção, não tenho certeza de como você pode fazer isso por meio de parâmetros em C# com System.Data.
ODP vem com muitos exemplos e há exemplos nos links acima.
Vou adicionar mais alguns links que espero ajudar:
- índice ODP do visual studio
- isso mostra exatamente como utilizar o ODT para criar seus wrappers de classe personalizada e chamá-los (observe que isso está no meio do caminho, eles usam a ferramenta para criar os tipos personalizados acima no exemplo -- este passo a passo é bastante completo e deve levá-lo diretamente para onde você precisa estar)
- Download :agora esse cara também instala arquivos de amostra, este é outro excelente exemplo de exatamente o que você precisa fazer:uma vez instalado, vá para [caminho do diretório que você instala]..\product\11.2.0\client_1\odp.net\samples\4\UDT\object1.cs
Realmente vale a pena permitir que as ferramentas ODT para Visual studio criem suas classes para seus UDTs para você (por exemplo, IOracleCustomType e outros). você pode então entrar neles e alterá-los para atender às suas necessidades. então, quando tudo estiver dito e feito (trecho de object1.cs):
Person p1 = new Person();
p1.Name = "John";
p1.Address = "Address1";
p1.Age = 20;
// Establish a connection to Oracle
OracleConnection con = new OracleConnection(constr);
con.Open();
// Update Person object and insert it into a database table
OracleCommand cmd = new OracleCommand(sql1, con);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter param1 = new OracleParameter();
param1.OracleDbType = OracleDbType.Object;
param1.Direction = ParameterDirection.InputOutput;
// Note: The UdtTypeName is case-senstive
param1.UdtTypeName = "SCOTT.ODP_OBJ1_SAMPLE_PERSON_TYPE";
param1.Value = p1;
cmd.Parameters.Add(param1);
observe também que a classe Person deve implementar IOracleCustomType (que pode ser criado seguindo o link em #2)
/* Person Class
An instance of a Person class represents an ODP_OBJ1_SAMPLE_PERSON_TYPE object
A custom type must implement INullable and IOracleCustomType interfaces
*/
public class Person : INullable, IOracleCustomType
O acima é para um tipo personalizado completo, mas você está atrás de uma associação ODP de matriz associativa:
http://weblogs.asp .net/ricardoperes/archive/2009/05/14/odp-net-associative-arrays.aspx
você vai querer usar
param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
e tudo deve se encaixar