oracle entity-framework ado.net oracle11g odp.net

oracle - Cant Map SYS_REFCURSOR en Entity Framework



entity-framework ado.net (5)

Estoy intentando acceder a un procedimiento almacenado en Oracle 11g a través de Entity Framework. Puedo acceder a los procedimientos almacenados que devuelve escalares y aquellos devuelven el valor correcto. Pero cuando se utiliza SYS_REFCURSOR para devolver un conjunto de resultados, el parámetro OUT no se detecta en la importación de funciones .

Mi procedimiento almacenado es el siguiente

create or replace PROCEDURE "GetAllClientNames" ( "ID" IN NUMBER, "SAL" IN NUMBER, "EMP_CURSOR" OUT SYS_REFCURSOR) IS BEGIN OPEN EMP_CURSOR FOR SELECT FIRSTNAME FROM CLIENTS; END;

Pero cuando se actualiza la entidad y se importa la función, el parámetro SYS_REFCURSOR OUT no se detecta en la función importada para recuperar el conjunto de resultados.

por favor, ayúdenme en esto. Sin obtener el parámetro OUT, no puedo acceder al conjunto de resultados recuperados por el procedimiento almacenado.


Tuve un problema similar.

Después de una larga investigación, descubrí que el soporte de Oracle para el marco de la entidad aún no se ha desarrollado para usar tipos de datos complejos como tipo de retorno del procedimiento almacenado. Se puede hacer; pero es como tocar la nariz alrededor de tu cabeza. Por lo tanto, si usa EF de manera más fácil, mejor evitarlo y utilizar procedimientos almacenados directamente.

Finalmente, decidí ir con EF para crear, actualizar y eliminar (ya que tengo que implementar el seguimiento de auditoría) y el procedimiento almacenado para devolver los conjuntos de resultados.


Un tipo complejo como un cursor de ref se puede devolver desde un procedimiento almacenado de Oracle utilizando Entity Framework; solo requiere un poco de configuración adicional. Debe agregar el XML adecuado al archivo de configuración para identificar el refcursor que se devuelve y los tipos de datos de las columnas.

Ejemplo:

<oracle.dataaccess.client> <settings> <add name="schema.storedproc.RefCursor.ref_cursor_param_name" value="implicitRefCursor bindinfo=''mode=Output''" /> <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.0" value="implicitRefCursor metadata=''ColumnName=<column_name_here>;BaseColumnName=<column_name_here>;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2''" /> <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.1" value="implicitRefCursor metadata=''ColumnName=<column_name_here>;NATIVEDATATYPE=Date;ProviderType=Date''" /> <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.2" value="implicitRefCursor metadata=''ColumnName=<column_name_here>;NATIVEDATATYPE=Number;ProviderType=Int32''" /> </settings> </oracle.dataaccess.client>

Simplemente reemplace el valor schema.storedproc con el suyo. Tales como ACCOUNTING.GET_EMPLOYEES. Y reemplace column_name_here con su columna. Tal como EMP_ID. Retire los soportes angulares también.

Aquí hay un artículo completo para referencia: http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t3

Documentación en entradas XML: http://docs.oracle.com/cd/E11882_01/win.112/e18754/featImplRefCursor.htm#ODPNT319


Ahora el proveedor de datos Oracle permite este tipo de operaciones sin mucha prisa. Es muy elaborado para responder aquí. Se agrega una lectura rápida. Por favor, siga el enlace a continuación para obtener información detallada.

ODP.NET 11g versión 2 (11.2.0.3.0), y superior, permite a las aplicaciones ejecutar procedimientos almacenados con los parámetros REF CURSOR sin utilizar enlace explícito para estos parámetros en el código .NET.

Para un conjunto de resultados de solo lectura, como un REF CURSOR utilizando OracleDataReader, la información del esquema de REF CURSOR se recupera automáticamente.

Para algunos escenarios, como cuando se utilizan REF CURSORs o Entity Framework utilizables, los desarrolladores deben definir la información del esquema REF CURSOR para que la aplicación pueda vincular el REF CURSOR implícito. Las aplicaciones de Entity Framework utilizan el enlazado REF CURSOR implícito para crear instancias de tipos complejos a partir de los datos REF CURSOR. Las aplicaciones deben especificar la información de vinculación y metadatos REF CURSOR en el archivo de configuración app.config, web.config o machine.config .NET.

Los atributos proporcionados en el archivo de configuración .NET también se utilizan cuando la aplicación solicita información de esquema del objeto OracleDataReader que representa un REF CURSOR. Esto significa que para REF CURSORs que se crean utilizando un SELECT de una sola tabla, la aplicación puede actualizar esa tabla mediante el uso de OracleDataAdapter y OracleCommandBuilder.

Al utilizar Entity Framework, las importaciones de funciones pueden devolver un REF CURSOR con restricciones implícitas. El REF CURSOR se puede devolver como una colección de tipos complejos o tipos de entidad. Para devolver una colección de tipos complejos, el archivo de configuración de .NET debe definir la información de vinculación y metadatos REF CURSOR. Para devolver una colección de tipo de entidad, solo se debe definir la información de enlace en el archivo de configuración de .NET.

Encuentra la información completa aquí


No creo que vaya en forma oráculo con Entity Framework es una buena manera si desea ejecutar procedimientos almacenados y funciones con tipos de retorno complejos y campos binarios.


Para usar la función de importación con EF, debe hacer lo siguiente:

1) El primer OUT SYS_REFCURSOR encontrado en su lista de parámetros se convertirá en el resultado de la Función de la Entidad. Por lo tanto, es posible que deba ajustar su SP o función con un nuevo SP que contenga este OUT SYS_REFCURSOR

2) Debe configurar algunos metadatos sobre este cursor dentro de su app.config o web.config. Esto se automatiza mediante el diálogo Ejecutar procedimiento almacenado en Server Explorer.

Puede ver paso a paso este tutorial aquí: https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24

Para obtener más documentación sobre este tema, consulte la sección de Entity Framework de la Ayuda en línea de Oracle Developer Tools para Visual Studio.