sql >> Base de Datos >  >> RDS >> Oracle

Procedimiento almacenado de Oracle y tipo de datos personalizado

No podrá hacer esto fácilmente con System.Data.OracleClient en desuso pero puede utilizar ODP de Oracle con el uso de UDT. Si esa no es una opción, no estoy seguro de cómo puede hacerlo a través de parámetros en C# con System.Data.

ODP viene con muchos ejemplos y hay ejemplos en los enlaces anteriores.

Agregaré algunos enlaces más que espero ayuden:

  1. índice ODP de Visual Studio
  2. Esto le muestra exactamente cómo utilizar la ODT para crear contenedores de clase personalizados y llamarlos (Tenga en cuenta que esto es a mitad de camino, lo explican utilizando la herramienta para crear los tipos personalizados que se encuentran arriba en el ejemplo; este tutorial es bastante completo y debería llevarlo directamente a donde necesita estar)
  3. Descargar :ahora este tipo también instala archivos de muestra, este es otro excelente ejemplo de exactamente lo que debe hacer:una vez instalado, vaya a [ruta del directorio que instala]..\product\11.2.0\client_1\odp.net\samples\4\UDT\object1.cs

Realmente vale la pena permitir que las herramientas ODT para Visual Studio creen sus clases para sus UDT por usted (por ejemplo, IOracleCustomType y tal). a continuación, puede acceder a ellos y modificarlos para adaptarlos a sus necesidades. luego, una vez que todo esté dicho y hecho (fragmento 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);

también tenga en cuenta que la clase Person debe implementar IOracleCustomType (que se puede crear siguiendo el enlace en el 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

Lo anterior es para un tipo personalizado completo, pero está buscando un enlace ODP de matriz asociativa:

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

querrás usar

param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;

y todo debería encajar