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 outputis
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 := 'USER_ACCESS.getPresentStatus';
    ProcedureName := 'RC_COMMUNICATION.getCurrProdValuestoRC';
    Parameters.clear ;
    Parameters.CreateParameter('out_Client_Status', ftCursor, pdOutput, 00);
    ExecProc ;  //fire the procedure
  end;  // with


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, 00);                    


leider mit dem gleichen Ergebnis.

Kann mir einer von Euch einen Hinweis geben, was ich falsch mache ?

Viele Grüße,

Daniel

Moderiert von user profile iconMartok: SQL-Tags hinzugefügt
Moderiert von user profile iconMartok: 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:

Delphi-Quelltext
1:
var Test: integer;                    

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:
//==============================================================================
//PrepareStoredProcedure
//==============================================================================
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;

//==============================================================================
//PrepareDataset
//==============================================================================
procedure DatabaseAncestorClass.PrepareDataset;
begin
 MainADODataSet:=TADODataSet.Create(nil);
 MainADODataSet.CursorLocation:=clUseClient;
 MainADODataSet.CursorType:=ctDynamic;
 //MainADODataSet.CursorType:=ctKeyset;
 MainADODataSet.LockType:=ltOptimistic;
 MainADODataSet.EnableBCD:=false;
end;


Viele Grüße,

Daniel

Moderiert von user profile iconMartok: Beiträge zusammengeführt

Der Aufruf passiert dann mit Open :



Delphi-Quelltext
1:
2:
3:
   MainADOStoredProc.Open;
   PrepareDataset;
   MainADODataSet.Recordset:=MainADOStoredProc.Recordset;