如何调用ORACLE程序包中的存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调用ORACLE程序包中的存储过程相关的知识,希望对你有一定的参考价值。

pl/sql里,select
语句必须接into
,不接into那就得返回一个游标出去,比如
create
or
replace
package
test_package
is
procedure
query_test(num
number,po_cursor
out
sys_refcursor);
end
test_package;
create
or
replace
package
body
test_package
is
procedure
query_test(num
number,po_cursor
out
sys_refcursor)
is
begin

select
unitname,tradetype,workernumber

from
test

where
income=num;
end
query_test;
end
test_package;
参考技术A 如何调用ORACLE程序包中的存储过程
call
包名.存储过程名(输入的参数);
例如:调用sp_package包的update_sal过程。
call
sp_package.update_sal('SMITH',
1000);

如何使用实体框架在 oracle 包中调用存储过程?

【中文标题】如何使用实体框架在 oracle 包中调用存储过程?【英文标题】:How to call a Stored Procedure inside an oracle package with Entity Framework? 【发布时间】:2014-03-24 19:23:13 【问题描述】:

我在 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;

如何使用实体框架(代码优先)执行上述程序包(GETPERSONNELTRAINIGLIST)?

注意:我正在为 Oracle 使用实体框架 6.0(代码优先)和 devart EF Provider

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

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"

【问题讨论】:

【参考方案1】:

请按以下方式重写您的代码:

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与您联系

【讨论】:

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

您没有指定游标变量。

lst OUT T_CURSOR

这就是你有错误的原因。

您可以从这里possible answer 尝试解决方案。

【讨论】:

如何将lst 参数放入db.Database.SqlQuery this 不能提供帮助吗?关于ref cursor,但我认为制作它没有真正的问题吗?

以上是关于如何调用ORACLE程序包中的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的存储过程,有啥作用,以及怎么在代码中使用?

使用 ADO.NET 获取 Oracle 包中过程的存储过程元数据

Oracle包及包的调用

oracle 存储过程中如何用ROWID

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,

oracle 包中定义全局变量