Autor Beitrag
daniel.wetzler
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 21.07.11 09:38 
Liebe Delphi Experten,

ich habe auf meiner Datenbank im Package RC_COMMUNICATION folgende Prozedur :

ausblenden 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 :


ausblenden 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 :


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:
ausblenden Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG2d9dec28d04fb8263c8bb3f84b4dbbf5}</span></span>					

Wird:
ausblenden 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

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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?

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
daniel.wetzler Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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 :


ausblenden volle Höhe 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 :


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