[英]Call oracle Stored Procedure with EF fail
我有一个oracle存储过程,它在输入参数中包含2个字符串和一个日期,并将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>
函数import wizzard创建了一个结果对象并生成了一个访问函数:
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
我不明白为什么会失败
似乎有几个问题:
返回参数怎么样? 它被“映射”了吗? 再检查一遍
肯定在错误消息中明确答案:
“调用'MYPROSTO'时参数的数量或类型错误”
您的过程需要4个参数,但您只需要传递3.您需要一个refcursor的输出变量。
我有同样的事情发生在我身上,最终解决了它。 我和你一样使用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参数列表,包括光标。 如果单击“显示配置”按钮,它将显示您的EF app.config中需要的内容。 AddConfig按钮将为您添加它。 这有助于避免错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.