实体框架和 Oracle 客户端 - 存储过程问题

Posted

技术标签:

【中文标题】实体框架和 Oracle 客户端 - 存储过程问题【英文标题】:Entity Framework and Oracle Client - Issue with stored procedure 【发布时间】:2012-06-29 09:38:27 【问题描述】:

我在项目中使用带有 Oracle 的实体框架并尝试从 EF 调用存储过程。过程如下

Create or Replace Procedure usp_RotaPlateProductie_Select(
    p_afdelingId in varchar2,
    p_productTypeId in varchar2,
    p_productieData out sys_refcursor)
IS 
Begin
    Open p_productieData for
        Select rp.Batchnummer, cppo.Productnummer, p.Omschrijving, pra.Bruto_In_Meters
        From Rotaplateproductie rp inner join Productieresultaatrtplrol pra
        on rp.Batchnummer = pra.Batchnummer inner join Cpiplusproductieorder cppo
        on pra.ProductieNummer = cppo.ProductNummer inner join Product p
        on cppo.Productnummer = p.Productnummer Where rp.Afdelingid = p_afdelingId
        and rp.producttype = p_productTypeId; 
END;

但是当 EF 执行该函数时,我收到以下错误

ORA-06550: line 1, column 8:
PLS-00306: wrong number or types of arguments in call to 'USP_ROTAPLATEPRODUCTIE_SELECT.
ORA-06550: line 1, column 8:
PL / SQL: Statement IGNORED.

我正在使用以下代码调用此过程

public ObjectResult<RotaPlateProductie> Search_RotaPlateProductie(global::System.String p_AFDELINGID, global::System.String p_PRODUCTTYPEID)
    
        ObjectParameter p_AFDELINGIDParameter;
        if (p_AFDELINGID != null)
        
            p_AFDELINGIDParameter = new ObjectParameter("P_AFDELINGID", p_AFDELINGID);
        
        else
        
            p_AFDELINGIDParameter = new ObjectParameter("P_AFDELINGID", typeof(global::System.String));
        

        ObjectParameter p_PRODUCTTYPEIDParameter;
        if (p_PRODUCTTYPEID != null)
        
            p_PRODUCTTYPEIDParameter = new ObjectParameter("P_PRODUCTTYPEID", p_PRODUCTTYPEID);
        
        else
        
            p_PRODUCTTYPEIDParameter = new ObjectParameter("P_PRODUCTTYPEID", typeof(global::System.String));
        

        return base.ExecuteFunction<RotaPlateProductie>("Search_RotaPlateProductie", p_AFDELINGIDParameter, p_PRODUCTTYPEIDParameter);
    

RotaPlateProductie 是我绑定结果集的实体 请帮忙。

【问题讨论】:

如何调用程序?错误是说您使用错误数量或类型的参数调用了该过程,您的过程的目的是什么?你能提供更多细节吗? @mcha - 使用 EF 的函数导入,我在后面的模型代码中提取了 SP,并使用 Context.FunctionName 我正在使用所需的输入参数调用该过程。如果您需要更多信息,请告诉我 请编辑您的问题并添加设置参数和调用存储过程的代码。谢谢。此外,在您进行导入后,此过程是否已修改并添加或删除了参数? @BobJarvis - 添加了代码。函数导入后程序之间没有修改 您的代码如何处理 P_PRODUCTIEDATA 输出参数?调用代码中没有提到它。 【参考方案1】:

你必须添加配置;i在你的情况下应该如下:

<oracle.dataaccess.client
    <settings>
      <add name="rp.usp_RotaPlateProductie_Select.RefCursor.p_productieData" value="implicitRefCursor bindinfo='mode=Output'" />...
   <settings>
</oracle.dataaccess.client

【讨论】:

以上是关于实体框架和 Oracle 客户端 - 存储过程问题的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架和存储过程进行并发检查

无法在实体框架中映射 SYS_REFCURSOR

存储过程参数名称和实体框架

在实体框架中使用存储过程

使用实体框架核心生成和访问存储过程

如何创建可以返回特定实体以及所有实体的 Oracle 存储过程