sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo devolver un RefCursor de la función de Oracle?

Creo que te falta sqlCom.ExecuteNonQuery();

además, en lugar de ejecutar select func_test(7) from dual; vamos a cambiarlo para ejecutar la función y pasar el parámetro

  OracleConnection oracleCon = new OracleConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);


  // Set the command

  string anonymous_block = "begin " +
                              "  :refcursor1 := func_test(7) ;" +
                              "end;";  
 //fill in your function and variables via the above example
  OracleCommand sqlCom= con.CreateCommand();
  sqlCom.CommandText = anonymous_block;

  // Bind 
  sqlCom.Parameters.Add("refcursor1", OracleDbType.RefCursor);
  sqlCom.Parameters[0].Direction = ParameterDirection.ReturnValue;

  try 
  {
    // Execute command; Have the parameters populated
    sqlCom.ExecuteNonQuery();

    // Create the OracleDataAdapter
    OracleDataAdapter da = new OracleDataAdapter(sqlCom);

    // Populate a DataSet with refcursor1.
    DataSet ds = new DataSet();
    da.Fill(ds, "refcursor1", (OracleRefCursor)(sqlCom.Parameters["refcursor1"].Value));

    // Print out the field count the REF Cursor
    Console.WriteLine("Field count: " + ds.Tables["refcursor1"].Columns.Count);
  }
  catch (Exception e)
  {
    Console.WriteLine("Error: {0}", e.Message);
  }
  finally
  {
    // Dispose OracleCommand object
    cmd.Dispose();

    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();}

esto se basa en el ODP de ejemplo que se puede encontrar en %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj

Si desea evitar (¡para bien o para mal!) la colección de parámetros personalizados para cada llamada de proceso/función, puede evitarlo utilizando bloques anónimos en su código, he modificado (¡una vez más sin probar!) el código anterior para reflejar esta técnica. Aquí hay un buen blog (de nada menos que Mark Williams) que muestra esta técnica. http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html