Abfrage einer Stored Procedure einer Oracle 10g Datenbank die einen Ref Cursor zurückgibt

21/07/2011 - 11:29 von Daniel Wetzler | Report spam
Liebe Delphi Experten,

ich habe auf meiner Datenbank im Package RC_COMMUNICATION folgende
Prozedur :

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 :


with ADOStoredProc1 do begin
//ProcedureName := 'USER_ACCESS.getPresentStatus';
ProcedureName := 'RC_COMMUNICATION.getCurrProdValuestoRC';
Parameters.clear ;
Parameters.CreateParameter('out_Client_Status', ftCursor, pdOutput, 0,
0);
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 :


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
 

Lesen sie die antworten

#1 Stefan Graf
21/07/2011 - 18:45 | Warnen spam
Am 21.07.2011 11:29, schrieb Daniel Wetzler:
Liebe Delphi Experten,

ich habe auf meiner Datenbank im Package RC_COMMUNICATION folgende
Prozedur :

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 :


with ADOStoredProc1 do begin
//ProcedureName := 'USER_ACCESS.getPresentStatus';
ProcedureName := 'RC_COMMUNICATION.getCurrProdValuestoRC';
Parameters.clear ;
Parameters.CreateParameter('out_Client_Status', ftCursor, pdOutput, 0,
0);
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 :


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,


Eine Funktion, welche ein REF-Cursor zurück gibt, rufe ich so auf:

with TADOCommand.Create(Self) do begin
Connection := xxx;

CommandText := 'PA_xxxx.GetCursor';
CommandType := cmdStoredProc;

Parameters.CreateParameter('pID', ftString, pdInput, 32, ID);
Parameters.CreateParameter('pApp', ftString, pdInput, 32, App);

Prepared := False;

RefDataSet.Recordset := Execute;

RefDataSet.First;

while not (RefDataSet.Eof) do begin
..

RefDataSet.Next;
end;
end;

Wichtig ist, in der AD-Connect-Definition den Parameter PLSQLRSet=1
anzugeben, sonst geht es nicht.

Làuft seit 9i mit Delphi 7 bis 11g mit Delphi 2007

Stefan Graf

Ähnliche fragen