2015-07-03 65 views
7

我有一个oracle存储的过程,它需要2个字符串和在输入parametter日期和这给一个引用游标作为输出:调用Oracle失败

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 

我不明白为什么它会失败

+0

确定pDate是否映射到VARCHAR2? – bubi

+0

你是什么意思?你建议我尝试在我的存储过程中传递varchar而不是日期吗? –

+0

您是否试过查看http://docs.oracle.com/cd/E51173_01/win.122/e17732/featImplRefCursor.htm#ODPNT321?另外,尝试在本地数据类型中将'Varchar2'更改为'varchar2'(下面的手册,它是Oracle,你永远不知道)。 – flindeberg

回答

3

似乎有几个问题:

  • 发送一个varchar(2)进入日期字段
  • 一个参数的名称“PTY “与 ”PTYPE“
  • 的参数名称 ”PPL“ 相对于 ”pPlant“
  • 一个参数的名称 ”PPLT“ 相对于 ”PPL“
+0

这是我的annonimisation过程中的一个错误,请参阅我的编辑 –

+0

这可能解释以上2点但不是全部4 –

+0

固定为最后一个错字。但是,你在哪里看到varchar2变成日期? –

0

什么是返回参数。这是“映射”好吗?双检

0

肯定的答案是错误信息明确:

“错误的数量或类型的呼叫‘MYPROSTO’参数”

你的过程需要4个参数,但你只传递3. 您需要refcursor的输出变量。

0

我有同样的事情发生在我身上,最终解决了它。我和你一样使用了oracle.manageddataaccess.client,并将我的.NET解决方案分成了一个Presentation Project,WebAPI Project和Data Access Project。我在数据访问项目中的app.config具有正确的ImplicitRefCursor部分,其中包含游标定义和元数据,但我忘了也将其复制到我的WebAPI项目的web.config中。一旦我这样做了,我的“错误的数量或类型的争论”错误就消失了。希望有所帮助。 (我刚刚复制了整个oracle.manageddataaccess.client节)。

另外,如果您手动生成整个ImplicitRefCursor节,我发现了一个更简单可靠的方法。从.NET Server Explorer中,连接到数据库,找到您的存储过程,右键单击它并运行。然后确定。它会调出IN和OUT参数列表,包括光标。如果你点击Show Config按钮,它会告诉你你的EF app.config需要什么。 AddConfig按钮将为您添加它。这有助于避免错误。