Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Procedimento armazenado da Oracle e tipo de dados personalizado


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:
  1. índice ODP do visual studio
  2. 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)
  3. 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