如何使用Entity Framework调用Oracle包中的存储过程?

8
我有一个在 Oracle 11g 中的包,如下所示:
CREATE OR REPLACE PACKAGE "HRS.PKG_TRAINING_SP" as
TYPE T_CURSOR IS REF CURSOR;

procedure GETPERSONNELTRAINIGLIST(
        personnel_Id_in in string,
        base_date_in in string,
        is_current_in in number,
        lst OUT T_CURSOR );
end;

我该如何使用Entity Framework(代码优先)执行上述存储过程包(GETPERSONNELTRAINIGLIST)?

注意:我正在使用Entity Framework 6.0(代码优先)和devart EF Provider for Oracle。

更新: 我正在使用以下代码:

var param1 = new OracleParameter("personnel_Id_in", OracleDbType.VarChar, "c5eb5589-8fee-47b6-85ad-261a0307cc16", ParameterDirection.Input);
var param2 = new OracleParameter("base_date_in", OracleDbType.VarChar, "1112", ParameterDirection.Input);
var param3 = new OracleParameter("is_current_in", OracleDbType.Number, 1, ParameterDirection.Input);

var ATests =
    db.Database.SqlQuery<ATest>(
    "BEGIN PKG_TRAINING_SP.GETPERSONNELTRAINIGLIST(:personnel_Id_in, :base_date_in, :is_current_in); end;", 
    param1,  param2, param3).ToList();

但是出现了以下错误:
{"ORA-06550: line 1, column 7:\nPLS-00306: wrong number or types of arguments in call to 'GETPERSONNELTRAINIGLIST'\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored"}
2个回答

17
请按照以下方式重写您的代码:
var param1 = new OracleParameter("personnel_Id_in", OracleDbType.VarChar, "c5eb5589-8fee-47b6-85ad-261a0307cc16",  ParameterDirection.Input);
var param2 = new OracleParameter("base_date_in", OracleDbType.VarChar, "1112", ParameterDirection.Input);
var param3 = new OracleParameter("is_current_in", OracleDbType.Number, 1, ParameterDirection.Input);
var param4 = new OracleParameter("result", OracleDbType.Cursor, ParameterDirection.Output);

var ATests =
db.Database.SqlQuery<ATest>(
"BEGIN PKG_TRAINING_SP.GETPERSONNELTRAINIGLIST(:personnel_Id_in, :base_date_in, :is_current_in, :result); end;", 
param1,  param2, param3, param4).ToList();

此外,我们已经在我们的论坛http://forums.devart.com/viewtopic.php?t=29019上联系了您。

执行包中所有过程的最佳实践是什么? - Amir
当使用 Code-First 方法时,我们上述描述的方式(通过 SqlQuery 方法 http://msdn.microsoft.com/en-us/library/gg679117%28v=vs.103%29.aspx )是最合适的。 有关使用存储过程创建 EF 模型并使用它们的一般信息,请参见此处 http://www.devart.com/dotconnect/oracle/docs/?OracleRoutines.html - Devart
@Devart 你能帮忙看一下这个问题吗?非常感谢。http://stackoverflow.com/questions/23236071 - Timeless

0

您没有指定游标变量。

lst OUT T_CURSOR

这就是为什么你会出现错误的原因。

你可以尝试这里的解决方案 可能的答案


如何将lst参数放入db.Database.SqlQuery中? - Amir
这个链接不能帮助吗?虽然它是关于ref cursor的,但我认为没有真正的问题可以解决。 - smnbbrv

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