[EF + ORACLE] Procedimientos almacenados EF 4.1 y la Beta 2 de Oracle

Introducción

Hace un tiempo realice una serie de post acerca de usar Oracle con EF, y hace un mes os hable de la salida de la Beta 2 del Driver de Oracle para EF.

En este post vamos a ver como utilizar Procedimientos Almacenados de Oracle desde Entity Framework.

Usando Procedimientos

Partiendo del procedimiento:

   1: PROCEDURE "PROCEDURE1" (

   2:   "COCHE" OUT  SYS_RefCursor) IS

   3: BEGIN 

   4: open COCHE FOR SELECT id_coche,nombre,marca FROM COCHES;

   5:  

   6: END;

Donde vamos a devolver un cursor con toda la información de la Tabla Coches. El procedimiento compila y funciona de forma correcta.

Para poder hacer funcionar el procedimiento, y antes de agregarlo a nuestro modelo, será necesario realizar los siguientes pasos:

1) Agregar la referencia a “Oracle.DataAccess.Client”.

2) Configurar el fichero de Configuración para definir el Cursor:

Dentro del fichero de configuración vamos a definir una sección “oracle.dataaccess.client”:

   1: <oracle.dataaccess.client>

   2:   <settings>

   3:     <add name="JTorrecilla.Procedure1.RefCursor.Coche" value="implicitRefCursor bindinfo='mode=Output'" />

   4:     <add name="JTorrecilla.Procedure1.RefCursorMetaData.Coche.0" 

   5:     value="implicitRefCursor metadata='ColumnName=ID_COCHE;BaseColumnName=ID_COCHE; 

   6:            BaseTableName=COCHES;NATIVE_DATA_TYPE=number;ProviderType=Decimal;PROVIDER_DB_TYPE=Decimal; 

   7:            DataType=System.Decimal;ColumnSize=8;AllowDbNull=False'" />

   8:     <add name="JTorrecilla.Procedure1.RefCursorMetaData.Coche.1" 

   9:             value="implicitRefCursor metadata='ColumnName=NOMBRE;BaseColumnName=NOMBRE;

  10:              BaseTableName=COCHES;NATIVE_DATA_TYPE=Varchar2;ProviderType=Varchar2;

  11:              DataType=System.String;ColumnSize=50'" />

  12:     <add name="JTorrecilla.Procedure1.RefCursorMetaData.Coche.2" 

  13:              value="implicitRefCursor metadata='ColumnName=MARCA;

  14:              BaseColumnName=MARCA;BaseTableName=COCHES;NATIVE_DATA_TYPE=Varchar2;

  15:              ProviderType=Varchar2;DataType=System.String;ColumnSize=50'" />

  16:   </settings>

  17: </oracle.dataaccess.client>

Hemos añadido 4 lineas: la primera define el nombre del cursor y el modo de enlace. Las otras entradas, definen cada una de las columnas que se utilizan en el cursor, así como los tipos de datos y su mapeo dentro de .NET.

Las características que se pueden definir son:

– Nombre de la Columna (ColumnName)

– Tipo de datos nativo en Oracle (Native_Data_Type)

– Tipo de datos del proveedor Oracle (ProviderType)

– Tipo de datos de BD del proveedor(ProviderDBType)

-Tipo de Dato soportado por .NET (DataType)

– Tamaño (ColumnSize)

– Precision (NumericPrecision) y Escala (NumericScale)

– Admisión de Nulos (AllowDBNull)

Una vez configurado el Cursor, vamos a importarlo dentro de nuestro modelo de datos en EF:

Abriremos el explorador del modelo, y desplegaremos los Procedimientos almacenados:

Con el botón secundario sobre “Procedure1” mostraremos el menú contextual y seleccionaremos la opción “Add Function Import”.

Con ello se abrirá un asistente donde elegiremos el Procedimiento que queremos importar, podremos indicar como querremos llamar a la función dentro de nuestro código y nos permitirá ver la información que hemos definido en el fichero de configuración tras presionar el botón “Get Column Info”

En este ejemplo, en el que el resultado del procedimiento devuelve un tipo “Coches” podemos definir que el procedimiento devuelve una colección de ese tipo.

En el caso de que el resultado no se corresponda con una de nuestras entidades, tenemos la posibilidad de definir un nuevo tipo de datos complejo a través del botón “Create New Complex Type”.

Para consumir este procedimiento bastaría con ejecutar el siguiente código:

 

   1: var coches = ent.PROCEDURE1();

   2: foreach (var c in coches)

   3:                 MessageBox.Show(c.MARCA);

 

Espero que os sea de utilidad.

Bibliografía:

Readme Beta 2 de Oracle

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *