Wie zum Aufruf einer Oracle-Funktion mit Ref Cursor als Out-parameter von C#?

Ich bin mit einem Produkt, das eine Datenbank-API auf Basis von Oracle-Funktionen, und ich bin in der Lage, Funktionen aufzurufen über ODP.NET im Allgemeinen. Jedoch kann ich nicht herausfinden, wie man eine Funktion aufrufen, enthält einen Ref-Cursor als Out-parameter. Alle Beispiele die ich bisher gefunden entweder eine Prozedur aufrufen, die mit der Out-parameter oder eine Funktion mit der Ref Cursor als Rückgabewert. Ich habe versucht, Parameter zu definieren, ähnlich, aber erhalte die Fehlermeldung, dass die falsche Anzahl oder Typ der Parameter angegeben ist.

Hier ist die Funktion header (natürlich verschleiert):

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

Diese Art von Definitionen in "somepackage":

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

- Und dies ist der code, den ich versucht habe:

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;

Die ich habe versucht im folgenden verschiedene Möglichkeiten zum Aufruf der Funktion (natürlich nur eins zu einem Zeitpunkt):

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

Aber jeder von Ihnen schlägt fehl mit der Fehlermeldung:

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.

So ist es in der Regel möglich, eine Funktion aufzurufen, die mit einer Ref-Cursor als Out-parameter von C# mit ODP.NET? Kann ich eine Funktion aufrufen, die einen gleichen Aufbau mit einer Varchar2-Out-parameter anstelle des Ref-Cursors ohne Probleme...

Btw, ich bin mit ODP.NET version 2.112.2.0 aus C#.NET 3.5 in Visual Studio 2008.

Dank im Voraus für Eure Hilfe!

InformationsquelleAutor Martin Klinke | 2011-06-15

Schreibe einen Kommentar