es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Llamar a una tabla de objeto de Oracle en un procedimiento desde .NET Core.

Tengo un tipo en Oracle que es un objeto

TYPE xyz AS OBJECT(col1 VARCHAR2(10),
                  col2 NUMBER,
                  col3 VARCHAR2(100));

y un tipo en Oracle que es una tabla

TYPE xyz_table AS TABLE OF xyz

y este tipo se utiliza como parámetro de entrada en un procedimiento almacenado.

Quiero llamar a este procedimiento almacenado desde mi aplicación .net core y pasar múltiples valores en este parámetro.

¿Alguna idea de cómo puedo lograr esto?

Actualmente estoy utilizando los siguientes espacios de nombres en mi aplicación .net core para Oracle:

c#
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;

He logrado hacer esto en SQL Server pero no puedo encontrar ninguna solución funcional para Oracle y .net core.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para enviar múltiples valores en el parámetro de entrada de un procedimiento almacenado de Oracle desde una aplicación .NET Core, puedes seguir los siguientes pasos:

    1. Crea un objeto del tipo ‘xyz_table’ en tu aplicación .NET Core y agrégale los valores deseados:
      var xyzTable = new Oracle.ManagedDataAccess.Types.OracleObject[2];
      xyzTable[0] = new Oracle.ManagedDataAccess.Types.OracleObject(conn, "XYZ", "NOMBRE_ESQUEMA");
      xyzTable[0].Type.GetProperty("COL1").SetValue(xyzTable[0], "Valor1");
      xyzTable[0].Type.GetProperty("COL2").SetValue(xyzTable[0], 123);
      xyzTable[0].Type.GetProperty("COL3").SetValue(xyzTable[0], "Descripción1");
      xyzTable[1] = new Oracle.ManagedDataAccess.Types.OracleObject(conn, "XYZ", "NOMBRE_ESQUEMA");
      xyzTable[1].Type.GetProperty("COL1").SetValue(xyzTable[1], "Valor2");
      xyzTable[1].Type.GetProperty("COL2").SetValue(xyzTable[1], 456);
      xyzTable[1].Type.GetProperty("COL3").SetValue(xyzTable[1], "Descripción2");
      
    2. Crea un objeto ‘OracleParameter’ para el parámetro de entrada y configura su ‘OracleDbType’ como ‘OracleDbType.Object’, ‘CollectionType’ como ‘OracleCollectionType.PLSQLAssociativeArray’ y ‘Value’ como el objeto creado en el paso 1:
      var param = new OracleParameter("p_xyz_table", OracleDbType.Object, null, ParameterDirection.Input);
      param.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
      param.UdtTypeName = "XYZ_TABLE";
      param.Value = xyzTable;
      
    3. Crea un objeto ‘OracleCommand’ para el procedimiento almacenado y agrega el parámetro creado en el paso 2 a su colección ‘Parameters’:
      var cmd = new OracleCommand("NOMBRE_SP", conn);
      cmd.BindByName = true;
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add(param);
      
    4. Ejecuta el comando:
      cmd.ExecuteNonQuery();
      

    Nota: Reemplaza ‘conn’ con el objeto ‘OracleConnection’ que representa la conexión a tu base de datos, y ‘NOMBRE_SP’ con el nombre de tu procedimiento almacenado. Además, asegúrate de agregar ‘Oracle.ManagedDataAccess.dll’ como referencia en tu proyecto y de incluir las declaraciones ‘using’ para los espacios de nombres ‘Oracle.ManagedDataAccess.Client’ y ‘Oracle.ManagedDataAccess.Types’ en tu código.

Comments are closed.