2011-06-15 106 views
6

Estoy usando un producto que proporciona una API de base de datos basada en funciones de Oracle y puedo llamar funciones a través de ODP.NET en general. Sin embargo, no puedo entender cómo llamar a una función que incluye un Cursor de Ref como parámetro de Salida. Todas las muestras que encontré hasta ahora llaman a un procedimiento con Out-parameter o una función con el Ref Cursor como valor de retorno. Traté de definir los parámetros de manera similar, pero sigo recibiendo el error de que se proporciona el número o tipo de parámetros incorrectos.Cómo llamar a una función de Oracle con un Cursor de Ref como parámetro de Salida desde C#?

Aquí es la cabecera de la función (obviamente ofuscado):

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

Estas son las definiciones de tipo de "algunpaquete":

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

Y este es el código que he intentado:

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; 

Probé las siguientes formas diferentes de llamar a la función (por supuesto, solo una a la vez):

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

Pero cada uno de ellos falla con el mensaje de error:

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. 

lo tanto, es generalmente posible llamar a una función con un cursor de Referencia como el parámetro fuera de C# con ODP.NET? Puedo llamar a una función con la misma estructura con un parámetro Varchar2-Out en lugar del Cursor de Ref sin problemas ...

Btw, estoy usando ODP.NET versión 2.112.2.0 desde C# .NET 3.5 en Visual Studio 2008.

Gracias de antemano por su ayuda!

Respuesta

10

Seguro que sí. Hay algunas trampas para tener cuidado de, pero aquí es un caso de prueba

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. he encontrado que funciones le gusta tener el ReturnValue como THE FIRST parámetro en la colección
  2. BindByName es por defecto FALSO, por lo que por defecto de obligar por la posición

lo contrario, es bastante sencillo:

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)); 
    } 

    } ... 

ahora para más muestras de ir a su directorio de inicio de Oracle y buscar @ las muestras de cursor en Ref ODP.NET

por ejemplo: % casa de cliente de Oracle% \ odp.net \ samples \ 4 \ refcursor

hth

+0

gracias por proporcionar el directorio de muestras. has guardado el día:] –

Cuestiones relacionadas