Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADOStoredProc liefert Oraclefehler beim anhäkeln von Active (https://www.delphipraxis.net/157767-adostoredproc-liefert-oraclefehler-beim-anhaekeln-von-active.html)

Glühwürmchen 24. Jan 2011 15:30

Datenbank: Oracle • Version: 10g • Zugriff über: ADOConnection

ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Hallo Allerseits,

mein Problem betrifft zunächst mal nur die Entwicklungszeit.

Ich habe in einem Datenmoul eine ADO-Connection, die sich über active=true auf die DB verbindet.
In der DB gibt es eine StoredProcedure (SP_BlaBlub), die sich im PL/SQL Developer compilieren lässt.
In Delphi im Datenmodul habe ich eine ADOStoredProc, die sich auf eben diese StoredProcedure beruft und die eingangs erwähnte ADO-Connection benutzt.
Wenn ich dann bei der ADOStoredProc bei active ein Häkchen setze, dann kommt die Fehlermeldung:

"ORA-06550: Zeile 1, Spalte 7:
PLS-00306: Falsche Anzahl oder Typen von Argumenten in Aufruf von SP_BlaBlub
ORA-06550: Zeile 1, Spalte 7:
PL/SQL: Statement ignored."

Kann mir mir von Euch jemand einen Tip geben, wo ich den Fehler suchen muss?
Das verwendete Delphi ist D-2010 Prof.

shmia 24. Jan 2011 15:39

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Gibt die Stored Proc ein Rowset als Ergebnis zurück?
Falls nein, ist es verboten das Property Active auf True zu setzen.
Stattdessen darf nur ExecProc im Sourcecode aufgerufen werden:
Delphi-Quellcode:
ADOStoredProc1.Parameters.ParamValues['ArtikelNr'] := ...;
ADOStoredProc1.ExecProc;

Bernhard Geyer 24. Jan 2011 15:42

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Welcher ADO-Provider? Die von MS sind an vielen Stellen fehlerhaft. Und MS hat mittlerweile jeglichen Support/Weiterentwicklung eingestellt.

Glühwürmchen 24. Jan 2011 15:45

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Sehr schnelle Antwort, danke.
Woran erkenne ich denn, ob die Stored Proc ein Rowset als Ergebnis zurückliefert?

Sie gibt jeden falls ein "varchar2" zurück.
Den von Dir erwähnten Aufruf teste ich jetzt mal....

Glühwürmchen 24. Jan 2011 15:48

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Provider=OraOLEDB.Oracle.1;Password=...;Persist Security Info=True;User ID=...;Data Source=XE;Extended Properties=""

Glühwürmchen 24. Jan 2011 15:51

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Kaum macht man es richtig, schon geht es!
Der Tip mit dem "ExecProc" war zielführend.

Danke.

Glühwürmchen 24. Jan 2011 16:35

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Nun habe ich aber doch noch eine Frage:

Wenn das hier das Script ist, mit dem die SP in die DB kam,

was muss ich dann tun um an den ReturnWert der SP heranzukommen?

CREATE OR REPLACE FUNCTION SP_BlaBlub(iAbc_ID in varchar2) return varchar2
IS
tCnt pls_integer;
tRes varchar2(4) := 'F';
begin
select count(*) into tCnt from tableXox t where Xyz_ID = '14' and t.P_ID = iAbc_ID;
if tCnt > 0 then
tRes := 'T';
end if;
return tRes;
EXCEPTION
WHEN OTHERS THEN
...
;
END;

Ich habe bisher folgende drei Zeilen:
ADOStoredProc_SP_BlaBlub.Open;
DM1.ADOStoredProc_SP_BlaBlub.Parameters.ParamValue s['iAbc_ID'] := '020880';
DM1.ADOStoredProc_SP_BlaBlub.ExecProc;

Wie was muss ich schreiben um an
tRes
heranzukommen?

DeddyH 24. Jan 2011 16:39

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Ich kenne mich mit der Kombination ADO/Oracle zwar nicht aus, aber geht es so?
Delphi-Quellcode:
DM1.ADOStoredProc_SP_BlaBlub.Parameters.ParamValues['iAbc_ID'] := '020880';
DM1.ADOStoredProc_SP_BlaBlub.Open;
ShowMessage(DM1.ADOStoredProc_SP_BlaBlub.Fields[0].AsString);

mikhal 24. Jan 2011 16:48

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Wenn die SP bereits auf der Datenbank liegt, müsstest du eigentlich so an das Ergebnis kommen:

Code:
SELECT SP_BLABLUB('020880') ERGEBNIS FROM DUAL
Dieses Statement packst du in eine AdoQuery und rufst das Ergebnis mit Open und FieldByNAme('Ergebnis').AsString ab. Dann brauchst du natürlich auch keine AdoStoredProcedure mehr...

Grüße
Mikhal

Glühwürmchen 24. Jan 2011 17:10

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Zitat:

Zitat von mikhal (Beitrag 1076929)
Code:
SELECT SP_BLABLUB('020880') ERGEBNIS FROM DUAL

FROM DUAL?
Was ist "DUAL"?
Ja, die StoredProcedure ist schon auf der DB.



Zitat:

Zitat von GeddyH (Beitrag 1076927)
Code:
ShowMessage(DM1.ADOStoredProc_SP_BlaBlub.Fields[0].AsString);

Nein, dieser Code funzt nicht. Er bringt wieder den eingangs erwähnten Fehler.

mikhal 24. Jan 2011 17:19

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
DUAL ist die Allerwelts-Tabelle des Oracle-Systems. Die kannst du in jedem Statement einsetzen, wenn du keine Tabelle zur Verfügung stehen hast.

Das FieldByName bezog sich auf die AdoQuery. Das Ergebnis liest du dort über das Feld "ERGEBNIS" des Select-Statements aus.

Bei AdoStoredProcedure musst du wohl noch ein Ergebnisfeld erzeugen: mittels Doppelklick auf das Komponenten-Icon öffnet sich ein Listendialog, in dem du ein Feld definieren kannst (erst mal eins hinzufügen). Darüber kannst du dann den Wert abgreifen, wenn es denn unbedingt diese Komponente sein muss. Aber wie bereits gesagt, mittels der Abfrage über DUAL kannst du dir diesen Umweg sparen (zumal du sowieso nur ein Zeichen als Ergebnis ausgibst).

Grüße
Mikhal

shmia 24. Jan 2011 18:07

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Zitat:

Zitat von Glühwürmchen (Beitrag 1076925)
Wie was muss ich schreiben um an tRes heranzukommen?

Der Returnwert müsste eigentlich ebenfalls als Parameter auslesbarbar sein:
Delphi-Quellcode:
ADOStoredProc_SP_BlaBlub.Parameters.ParamValue s['iAbc_ID'] := '020880';
ADOStoredProc_SP_BlaBlub.ExecProc;
ergebnis := ADOStoredProc_SP_BlaBlub.Parameters.ParamValues['???'];
Problem ist jetzt nur herauszufinden, welchen Namen der Parameter hat.
Delphi-Quellcode:
var
  i : Integer;
  p : TParameter;
begin
  for i := 0 to ADOStoredProc_SP_BlaBlub.Parameters.Count-1 do
  begin
    p := ADOStoredProc_SP_BlaBlub.Parameters.Items[i];
    ShowMessageFmt('%d: %s - %s',[i, p.Name, FieldTypeNames[p.DataType]]);
  end;

jobo 24. Jan 2011 19:15

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Hallo,

ich schließe mich Mikhal an.
Wenn in der Lage bist ein TQuery bzw. ein TADOQuery einzusetzen, dann kannst Du Dir etwas Arbeit sparen.

Delphi-Quellcode:
..
myAdoQuery.sql.clear;
myAdoQuery.sql.add('SELECT SP_BLABLUB('020880') ERGEBNIS FROM DUAL');
myAdoQuery.open;
showmessage(myAdoQuery.Fields[0].AsString;
..
Das ist nicht getestet!

Wenn es unbedingt TADOStoredProc sein muss:
Eine Oracle Funktion liefert ihren Rückgabewert unter Delphi glaube ich als 1. Parameter zurück. Kann mich aber nicht genau erinnern, da ich Oracle Funktionen und Prozeduren immer mit TADOQuery verarbeite / aufrufe.

Glühwürmchen 25. Jan 2011 11:00

AW: ADOStoredProc liefert Oraclefehler beim anhäkeln von Active
 
Zitat:

Zitat von jobo (Beitrag 1076961)
Wenn in der Lage bist ein TQuery bzw. ein TADOQuery einzusetzen, dann kannst Du Dir etwas Arbeit sparen.

Delphi-Quellcode:
..
myAdoQuery.sql.clear;
myAdoQuery.sql.add('SELECT SP_BLABLUB('020880') ERGEBNIS FROM DUAL');
myAdoQuery.open;
showmessage(myAdoQuery.Fields[0].AsString;
..
Das ist nicht getestet!


Es geht, es geht !!
Vielen Dank!
Ihr habt mir sehr geholfen.
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz