2011-06-15 22 views
6

我正在使用提供基于Oracle函数的数据库API的产品,并且通过ODP.NET可以调用函数。但是,我无法弄清楚,如何调用一个包含Ref Cursor作为Out参数的函数。到目前为止,我发现的所有样本或者使用Out参数调用过程,或者使用Ref Cursor作为返回值调用函数。我试图类似地定义参数,但不断收到提供错误数量或类型参数的错误。如何使用Ref Cursor作为C#外部参数调用Oracle函数?

下面是函数头(显然混淆):

FUNCTION GetXYZ(
    uniqueId  IN somepackage.Number_Type, 
    resultItems OUT somepackage.Ref_Type) 
    RETURN somepackage.Error_Type; 

这些都是在 “somepackage” 的类型定义:

SUBTYPE Number_Type IS NUMBER(13); 
TYPE Ref_Type IS REF CURSOR; 
SUBTYPE Error_Type IS NUMBER; 

这是我试过的代码:

string sql = "otherpackage.GetXYZ"; 
var getXYZCmd = OracleCommand oracleConnection.CreateCommand(sql); 
getXYZCmd.CommandType = CommandType.StoredProcedure; 

getXYZCmd.Parameters.Add("uniqueId", OracleDbType.Int32).Value = uniqueExplosionId; 
getXYZCmd.Parameters.Add("resultItems", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
getXYZCmd.Parameters.Add("return_value", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue; 

我试过以下不同的方式来调用函数(当然每次只有一个):

var result = getXYZCmd.ExecuteNonQuery(); 
var reader = getXYZCmd.ExecuteReader(); 
var scalarResult = getXYZCmd.ExecuteScalar(); 

但他们每个人的失败,出现错误消息:

Oracle.DataAccess.Client.OracleException: ORA-06550: line 1, column 15: 
PLS-00306: wrong number or types of arguments in call to 'GETXYZ' 
ORA-06550: line 1, column 15: 
PLS-00306: wrong number or types of arguments in call to 'GETXYZ' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored. 

那么,这通常可以从C#调用函数与参考光标作为输出参数与ODP.NET?我可以调用与Varchar2-Out参数相同的结构而不是参考游标没有问题的函数...

顺便说一句,我使用ODP.NET版本2.112.2.0从Visual C#.NET 3.5中Studio 2008.

在此先感谢您的帮助!

回答

10

你当然可以。有几个陷阱警惕的,但这里是一个测试用例

create or replace function testodpRefCursor(
        uniqueId IN NUMBER 
       ,resultItems OUT NOCOPY SYS_REFCURSOR) RETURN NUMBER 
       IS 

BEGIN 
     OPEN resultItems for select level from dual connect by level < uniqueId ; 
     return 1; 
END testodpRefCursor; 
  1. 我发现 职能喜欢有 返回值作为THE FIRST PARAM 收集
  2. BindByName是默认FALSE,所以它默认为BIND按位置

否则,它是相当简单:

OracleCommand cmd = new OracleCommand("TESTODPREFCURSOR", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.BindByName = true; 
    // Bind 


    OracleParameter oparam = cmd.Parameters.Add("ReturnValue", OracleDbType.Int64); 
    oparam.Direction = ParameterDirection.ReturnValue ;  

    OracleParameter oparam0 = cmd.Parameters.Add("uniqueId", OracleDbType.Int64); 
    oparam0.Value = 5 ; 
    oparam0.Direction = ParameterDirection.Input; 

    OracleParameter oparam1 = cmd.Parameters.Add("resultItems", OracleDbType.RefCursor); 
    oparam1.Direction = ParameterDirection.Output; 




    // Execute command 
    OracleDataReader reader; 
    try 
    { 
    reader = cmd.ExecuteReader(); 

    while(reader.Read()){ 
     Console.WriteLine("level: {0}", reader.GetDecimal(0)); 
    } 

    } ... 

现在更多的样品去你的Oracle主目录,并期待@ REF CURSOR的样品中ODP.NET

例如: %Oracle客户端家里%\ odp.net \样本\ 4 \ REFCURSOR

hth

+0

感谢您提供samples目录。你已经保存了一天:] – 2016-08-19 08:13:01

相关问题