sql >> Databáze >  >> RDS >> Oracle

Jak vrátit RefCursor z funkce Oracle?

Myslím, že vám chybí sqlCom.ExecuteNonQuery();

také namísto spuštění select func_test(7) z dual; přepněte jej na spuštění funkce a předejte parametr

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

toto je založeno na příkladu ODP, který lze nalézt @ %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj

Pokud se chcete vyhnout (v lepším nebo nejhorším!) vlastní sestavené sbírce parametrů pro každé volání proc/funkce, můžete to obejít použitím anonymních bloků ve vašem kódu, upravil jsem (opět netestováno!) výše uvedený kód, aby odrážel tuto techniku. Zde je pěkný blog (od nikoho jiného než Marka Williamse), který ukazuje tuto techniku.http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html




  1. Změna portu serveru postgres kontejnerů v Docker Compose

  2. Řešení s vysokou závažností chyb v SQL Server

  3. MySQL ERROR 1290 (HY000) --volba zabezpečený-soubor-priv

  4. Použití více schémat PostgreSQL s modely Rails