使用EF调用Oracle存储过程失败

7

我有一个Oracle存储过程,它需要两个字符串和一个日期作为输入参数,并输出一个ref游标:

CREATE OR REPLACE PROCEDURE SCHEMA.MYPROSTO (
   pPl    IN     VARCHAR2, -- Comma (;) separated
   pTy    IN     VARCHAR2,-- Comma (;) separated
   pDate     IN     mytable.mydate%TYPE,
   pCursor      OUT sys_refcursor)
IS
   .....
   sSQL      VARCHAR2 (3000);
BEGIN

   -- making SQL Order
   sSQL := 'SELECT TO_CHAR (v.date_c........

   ......


   OPEN pCursor FOR sSQL;

END MYPROSTO;

输出光标返回一组包含3个字符串单元格的行。

我在实体框架模型中导入了这个存储过程,并在 .config 文件中进行了如下配置:

<oracle.manageddataaccess.client>
<version number="*">
  <implicitRefCursor>
    <storedProcedure schema="SCHEMA" name="MYPROSTO">
      <refCursor name="PCURSOR">
        <bindInfo mode="Output"/>
        <metadata columnOrdinal="0" columnName="YEAR" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/>
        <metadata columnOrdinal="1" columnName="MONTH" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/>
        <metadata columnOrdinal="2" columnName="COUNT" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/>
      </refCursor>
    </storedProcedure>
  </implicitRefCursor>
</version>
</oracle.manageddataaccess.client>

函数导入向导创建了一个结果对象并生成了一个访问函数:

public virtual ObjectResult<MYPROSTO_Result> MYPROSTO (string pPL, string pTY, Nullable<System.DateTime> pDATE)
{
    var pPLParameter = pPL!= null ?
        new ObjectParameter("PPL", pPL) :
        new ObjectParameter("PPL", typeof(string));

    var pTYParameter = pTY!= null ?
        new ObjectParameter("PTY", pTY) :
        new ObjectParameter("PTY", typeof(string));

    var pDATEParameter = pDATE.HasValue ?
        new ObjectParameter("PDATE", pDATE) :
        new ObjectParameter("PDATE", typeof(System.DateTime));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<MYPROSTO_Result>("MYPROSTO", pPLParameter, pTYParameter, pDATEParameter);
}

然而,调用此函数会在最后一行引发异常(System.Data.Entity.Core.EntityCommandExecutionException):
ORA-06550: Ligne 1, colonne 8 : PLS-00306: wrong number or types of arguments in call to 'MYPROSTO'
ORA-06550: Ligne 1, colonne 8 : PL/SQL: Statement ignored

我不明白它为什么会失败。

pDate 映射到 VARCHAR2 类型可以吗? - bubi
你的意思是什么?你建议我在存储过程中尝试传递一个varchar而不是日期吗? - Remy Grandin
你尝试过查看http://docs.oracle.com/cd/E51173_01/win.122/e17732/featImplRefCursor.htm#ODPNT321吗?此外,尝试将本机数据类型中的“Varchar2”更改为“varchar2”(只是按照手册操作,这是Oracle,你永远不知道)。 - flindeberg
4个回答

3

看起来有几个问题:

  • 将 varchar(2) 发送到日期字段
  • 参数名称“pTY”与“pType”的不同
  • 参数名称“pPL”与“pPlant”的不同
  • 参数名称“PPLT”与“PPL”的不同

这是我匿名化过程中的一个错误,请查看我的编辑。 - Remy Grandin
已修复最后一个打字错误。但是,你在哪里看到将varchar2转换为日期? - Remy Grandin

1
我也遇到了同样的问题,最终解决了。像你一样,我使用了oracle.manageddataaccess.client,并将我的.NET解决方案分为Presentation Project、WebAPI Project和Data Access Project。我的Data Access Project中的app.config有正确的ImplicitRefCursor部分,包括游标定义和元数据,但我忘记将它复制到我的WebAPI项目的web.config中。一旦我这样做了,我的"wrong number or types of arguments"错误就消失了。希望这可以帮助你。(我只是复制了整个oracle.manageddataaccess.client部分。)
另外,如果你手动生成了整个ImplicitRefCursor部分,我发现有一个更简单可靠的方法。从.NET Server Explorer连接到你的数据库,找到存储过程,在其上右键单击并运行。然后点击“确定”按钮。它会显示一个包括游标在内的IN和OUT参数列表。如果你点击“显示配置”按钮,它会显示你EF app.config中需要的内容。而“添加配置”按钮则会为你添加它。这有助于避免错误。

谢谢,伙计!你救了我的命,这是我正在寻找的最后一块拼图。 - Ron Michael
太高兴了,那有所帮助。使用Entity Framework时,Oracle存储过程绝对不是用户友好的。 - Debbie A

0

返回参数怎么样?它“映射”得没问题吗?请再确认一下。


0

错误信息中已经很明确了:

“调用'MYPROSTO'时参数数量或类型不正确”

您的过程需要4个参数,但您只传递了3个。 您需要为refcursor添加一个输出变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接