Ausführen einer Oracle-Funktion, die einen Referenzcursor in C # zurückgibt

9

Ich habe ein Oracle-Paket mit einer Prozedur, die einen in-out-Referenzcursor hat. Mein Verständnis ist, dass dies ziemlich Standard ist.

Was mir nicht gefallen hat, ist die Tatsache, dass ich eine Menge Code schreiben musste, um nur die Ausgabe zu sehen. Also habe ich diese Frage gestellt und es stellt sich heraus, dass ich bekommen kann, was ich will, indem ich eine Funktion erstelle, die den Vorgang umschließt.

Update: Sieht so aus, als ob ich die Funktion nicht mehr benötige, aber es könnte trotzdem wissenswert sein, denn die Neugierigen sehen die ursprüngliche Frage und antworten auf Updates.

Hier ist die Funktion

%Vor%

und hier ist, was ich mache, um es in SQL Developer

auszuführen %Vor%

Von nun an werde ich die ForPrint-Funktionen wahrscheinlich allen meinen Prozeduren hinzufügen.

Das hat mich zum Nachdenken gebracht, vielleicht sind Funktionen das, was ich will und ich brauche keine Prozeduren.

Um dies zu testen, habe ich versucht, die Funktion von .NET auszuführen, außer ich kann es nicht tun. Ist das wirklich so?

%Vor%

So bekomme ich den Fehler.

getquestionsForPrint is not a procedure or is undefined

Ich habe auch ExecuteScalar mit dem gleichen Ergebnis versucht.

BEARBEITEN Den Rat von Slider345 nehmen Ich habe auch versucht, den Befehlstyp auf Text zu setzen und die folgende Anweisung zu verwenden  ungültige SQL-Anweisung

%Vor%

und

%Vor%

Abhis Variation für den Befehlstext verwenden

%Vor%

resultierte in

  

Die Anweisung bei "0x61c4aca5"   referenzierter Speicher bei "0x00000ce1". Das   Speicher konnte nicht "gelesen" werden.

Spreche ich nur den falschen Baum an?

Aktualisieren Der Versuch, einen Ausgabeparameter hinzuzufügen, hilft nicht.

%Vor%

Nicht sicher, was der Name sein sollte da es der Rückgabewert einer Funktion ist (ich habe versucht, null, leere Zeichenfolge, mypackage.getquestionsForPrint) aber in allen Fällen es ergibt sich nur in

  

ORA-06550: Zeile 1, Spalte 7:   PLS-00306: Falsche Anzahl oder Typen von   Argumente im Aufruf an   'getquestionsForPrint'

Final Edit (hoffentlich)

Anscheinend hat Guddie 3 Monate nach meiner Anfrage eine ähnliche Frage gestellt. Er hat die Antwort, die zu

ist
  • Setzen Sie Ihren Befehlstext auf einen anonymen Block
  • Bindet einen Parameter an den ref-Cursor, der die auszugebende Richtung festlegt
  • Rufen Sie Execute non reader auf.
  • Verwenden Sie dann Ihren Parameter
%Vor%     
Conrad Frix 20.08.2010, 22:53
quelle

3 Antworten

5

Ich habe das nicht mit einer Funktion getestet, sondern mit meinen gespeicherten Prozeduren. Ich gebe den out-Parameter für den refCursor an.

%Vor%

Wenn Sie die Funktion mit dem CommandType.Text arbeiten können. Ich frage mich, ob Sie versuchen können, den obigen Parameter hinzuzufügen, außer mit der Richtung als:

%Vor%

Ich verwende Oracle.DataAccess Version 2.111.6.0

    
Peter C 19.02.2011, 01:22
quelle
0

Meine Vermutung ist, dass Sie eine Funktion nicht mit einem Command-Objekt vom Typ 'StoredProcedure' aufrufen können. Können Sie ein Command-Objekt vom Typ 'Text' versuchen und die Funktion im Befehlstext ausführen?

    
Slider345 21.08.2010 00:07
quelle
0

Ich weiß, dass dies ein ziemlich alter Post ist, aber da ich so lange gebraucht habe, um alle Einzelheiten zu verstehen, die .NET mit "gut kämpfen" mit Oracle zu tun haben, dachte ich mir, ich würde diesen Rat da draußen machen jemand anderes in dieser klebrigen Situation.

Ich rufe häufig gespeicherte Prozeduren von Oracle auf, die eine REF_CURSOR in unserer Umgebung zurückgeben (.NET 3.5 gegen Oracle 11g). Für eine Funktion können Sie den Parameter in der Tat beliebig benennen, aber dann müssen Sie seine System.Data.ParameterDirection = ParameterDirection.ReturnValue und dann ExecuteNonQuery auf das OracleCommand -Objekt setzen. Zu diesem Zeitpunkt ist der Wert dieses Parameters der ref_cursor, den die Oracle-Funktion zurückgegeben hat. Übergeben Sie den Wert einfach als OracleDataReader und durchlaufen Sie die OracleDataReader .

Ich poste den vollständigen Code, aber ich schrieb die Datenzugriffsschicht in VB.NET vor Jahren, und der Großteil des Codes, der die Datenzugriffsebene (unser Firmenintranet) verbraucht, befindet sich in C #. Ich dachte, dass das Mischen von Sprachen in einer einzigen Antwort der größere Fehler wäre.

    
DizzyLogic 28.04.2013 01:23
quelle

Tags und Links