7

我正在尝试通过实体框架访问 Oracle 11g 上的存储过程。我可以访问返回标量和返回正确值的存储过程。但是,当使用SYS_REFCURSOR 返回结果集时,函数 import 上未检测到 OUT 参数

我的存储过程如下

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;

但是在更新实体并进行函数导入时,在导入的函数中未检测到 SYS_REFCURSOR OUT 参数以检索结果集。

这是导入函数的图像

请帮我解决这个问题。如果没有 OUT 参数,我无法访问存储过程检索到的结果集

4

5 回答 5

4

可以使用实体框架从 Oracle 存储过程返回复杂类型,例如引用游标;它只需要一些额外的配置。您必须将正确的 XML 添加到配置文件中,以识别返回的 refcursor 和列的数据类型。

例子:

<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>

只需将schema.storedproc值替换为您的值。比如 ACCOUNTING.GET_EMPLOYEES。并将column_name_here替换为您的列。如 EMP_ID。也去掉尖括号。

这是一篇完整的文章供参考: http ://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t3

XML 条目的文档:http: //docs.oracle.com/cd/E11882_01/win.112/e18754/featImplRefCursor.htm#ODPNT319

于 2013-10-30T15:30:16.813 回答
3

现在 oracle 数据提供者允许这种操作没有太多麻烦。它太复杂了,无法在这里回答。添加了快速阅读。请点击以下链接了解详细信息。

ODP.NET 11g 第 2 版 (11.2.0.3.0) 及更高版本使应用程序能够使用 REF CURSOR 参数运行存储过程,而无需在 .NET 代码中对这些参数使用显式绑定。

对于只读结果集,例如使用 OracleDataReader 的 REF CURSOR,会自动检索 REF CURSOR 模式信息。

对于某些场景,例如使用可更新的 REF CURSOR 或实体框架时,开发人员需要定义 REF CURSOR 架构信息,以便应用程序可以绑定隐式 REF CURSOR。实体框架应用程序使用隐式 REF CURSOR 绑定从 REF CURSOR 数据实例化复杂类型。应用程序必须在 app.config、web.config 或 machine.config .NET 配置文件中指定 REF CURSOR 绑定和元数据信息。

当应用程序从代表 REF CURSOR 的 OracleDataReader 对象请求模式信息时,也会使用 .NET 配置文件中提供的属性。这意味着对于使用 SELECT 从单个表中创建的 REF CURSOR,应用程序可以通过使用 OracleDataAdapter 和 OracleCommandBuilder 更新该表。

使用实体框架时,函数导入可以返回隐式绑定的 REF CURSOR。REF CURSOR 可以作为复杂类型或实体类型的集合返回。要返回复杂类型集合,.NET 配置文件需要定义 REF CURSOR 绑定和元数据信息。要返回实体类型集合,只需在 .NET 配置文件中定义绑定信息。

在此处查找完整信息

于 2014-10-15T12:40:25.143 回答
3

要将导入功能与 EF 一起使用,您需要执行以下操作:

1) 在你的参数列表中遇到的第一个 OUT SYS_REFCURSOR 将成为实体函数的输出。因此,您可能需要使用包含此 OUT SYS_REFCURSOR 的新 SP 包装您的 SP 或函数

2) 您需要在您的 app.config 或 web.config 中设置有关此光标的一些元数据。这是由服务器资源管理器中的“运行存储过程”对话框自动完成的。

您可以在此处查看逐步演练: 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

有关此主题的更多文档,请参阅 Oracle Developer Tools for Visual Studio 在线帮助的实体框架部分。

于 2014-10-23T19:24:28.177 回答
2

我有一个类似的问题。

经过长时间的研究,我发现 Oracle 对实体框架的支持尚未演变为使用复杂数据类型作为存储过程的返回类型。可以办到; 但这就像在你的头上摸鼻子。因此,如果您为了方便而使用 EF,那么最好避免使用它并直接使用存储过程。

最后我决定使用 EF 创建、更新和删除(因为我必须实现审计跟踪)和返回结果集的存储过程。

于 2013-08-21T09:43:00.473 回答
2

如果您想执行具有复杂返回类型和二进制字段的存储过程和函数,我认为使用 Entity 框架采用 oracle 方式并不是一个好方法。

于 2013-08-21T10:14:33.443 回答