Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle Stored Procedure e tipo di dati personalizzati

Non sarai in grado di farlo facilmente con System.Data.OracleClient obsoleto ma puoi utilizzare ODP di Oracle con l'utilizzo di UDT. Se questa non è un'opzione, non sono sicuro di come farlo tramite i parametri in C# con System.Data.

ODP viene fornito con molti esempi e ci sono esempi nei link sopra.

Aggiungo altri collegamenti che, si spera, aiutino:

  1. indice ODP dello studio visivo
  2. questo ti mostra esattamente come utilizzare l'ODT per creare i tuoi wrapper di classe personalizzata e chiamarli (ricorda che questo è a metà strada, loro procedono usando lo strumento per creare i tipi personalizzati sopra di esso nell'esempio -- questa procedura dettagliata è abbastanza completa e dovrebbe portarti direttamente dove devi essere)
  3. Scarica :ora questo tizio installa anche file di esempio, questo è un altro fantastico esempio di esattamente cosa devi fare:una volta installato, vai a [percorso della directory che installi]..\product\11.2.0\client_1\odp.net\samples\4\UDT\object1.cs

Vale davvero la pena consentire agli strumenti ODT per Visual Studio di creare le tue classi per i tuoi UDT per te (ad esempio IOracleCustomType e simili). puoi quindi esaminarli e modificarli in base alle tue esigenze. quindi una volta che tutto è stato detto e fatto (snippet da 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);

tieni inoltre presente che la classe Person deve implementare IOracleCustomType (che può essere creato seguendo il link al n. 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

Quanto sopra è per un tipo personalizzato completo, ma stai cercando un'associazione ODP di matrice associativa:

http://weblogs.asp .net/ricardoperes/archive/2009/05/14/odp-net-associative-arrays.aspx

vorrai usare

param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;

e tutto dovrebbe andare a posto