Entwickler-Ecke
Datenbanken - Abfrage einer Stored Procedure einer Oracle 10g Datenbank, u
daniel.wetzler - Do 21.07.11 09:38
Titel: Abfrage einer Stored Procedure einer Oracle 10g Datenbank, u
Liebe Delphi Experten,
ich habe auf meiner Datenbank im Package RC_COMMUNICATION folgende Prozedur :
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure getCurrProdValuestoRC (out_values OUT output) is prm_number_DS_check number; prm_present_status number; out_status number; begin
....... PL/SQL coding ist unwichtigt funktioniert aber (im sqldeveloper geprüft) .....
end getCurrProdValuestoRC; |
Dabei ist output ein Refcursor.
Diese Prozedur versuche ich mit Delphi 7 mit Hilfe der ADO Komponente aufzurufen.
Dazu habe ich folgendes geschrieben :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| with ADOStoredProc1 do begin ProcedureName := 'RC_COMMUNICATION.getCurrProdValuestoRC'; Parameters.clear ; Parameters.CreateParameter('out_Client_Status', ftCursor, pdOutput, 0, 0); ExecProc ; end; |
Sobald ich den Code ausführe erhalte ich die Fehlermeldung :
"Parameterobjekt ist nicht ordnungsgemäss definiert."
Bei einigen Recherchen habe ich gelsen, dass dies daran liegen könnte das das Mapping ADO<->Oracle in Delphi 7 falsch ist und habe folgendes ausprobiert :
Delphi-Quelltext
1:
| Parameters.CreateParameter('out_Client_Status', ftUnknown, pdOutput, 0, 0); |
leider mit dem gleichen Ergebnis.
Kann mir einer von Euch einen Hinweis geben, was ich falsch mache ?
Viele Grüße,
Daniel
Moderiert von
Martok: SQL-Tags hinzugefügt
Moderiert von
Martok: Delphi-Tags hinzugefügt
Martok - Do 21.07.11 13:13
Hallo und :welcome: im Delphi-Forum!
Bitte verwende für Quellcode die entsprechenden [delphi
]-Tags, dann wird er "schöner" dargestellt als im Fließtext. Beispiel:
Quelltext
1:
| <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG2d9dec28d04fb8263c8bb3f84b4dbbf5}</span></span> |
Wird:
Das Gleiche gibts auch für SQL, eine Auswahl findest du über dem Editor in der Toolbar unter "Bereiche".
Zum Problem: was mir auffällt, ist: du deklarierst einen Parameter 'out_Client_Status', in der Proc heißt der aber 'out_values'. Könnte das was damit zu tun haben? :gruebel:
Viele Grüße,
Martok
Nersgatt - Do 21.07.11 13:19
Kannst Du nicht nach der Zuweisung des ProcedureNames über Parameters[0].value den Wert setzen? Warum löscht Du die Parameterdefinition erst mit .Clear?
daniel.wetzler - Do 21.07.11 13:34
Hallo, vielen Dank für die freundliche Aufnahme im Forum !
Das mit den Tags ist eine gute Sache !
Ich habe nun ein schönes Beispiel für die Lösung des Problems bekommen und poste das einfach mal hier :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure DatabaseAncestorClass.PrepareStoredProcedure(theSP_Name:String;theReturnValueType:enumRetValueType); begin SP_Name:=theSP_Name; MainADOStoredProc:= TADOStoredProc.Create(nil); MainADOStoredProc.Connection:= MainADOConnection; MainADOStoredProc.ProcedureName:= theSP_Name; MainADOStoredProc.CursorType := ctKeyset; MainADOStoredProc.Parameters.Clear; if theReturnValueType=DataSet_Returned then begin ReturnValueType:=DataSet_Returned; MainADOStoredProc.ExecuteOptions:=[]; end else begin ReturnValueType:=No_DataSet; MainADOStoredProc.executeOptions:=[eoExecuteNoRecords]; end; end;
procedure DatabaseAncestorClass.PrepareDataset; begin MainADODataSet:=TADODataSet.Create(nil); MainADODataSet.CursorLocation:=clUseClient; MainADODataSet.CursorType:=ctDynamic; MainADODataSet.LockType:=ltOptimistic; MainADODataSet.EnableBCD:=false; end; |
Viele Grüße,
Daniel
Moderiert von
Martok: Beiträge zusammengeführt
Der Aufruf passiert dann mit Open :
Delphi-Quelltext
1: 2: 3:
| MainADOStoredProc.Open; PrepareDataset; MainADODataSet.Recordset:=MainADOStoredProc.Recordset; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!