Entwickler-Ecke
Datenbanken - Zugriff auf stored Procedure
hansa - Mi 26.02.03 12:00
Titel: Zugriff auf stored Procedure
Hi,
habe mir jetzt mal eine Stored Procedure angelegt. Wie komme ich da jetzt mit Delphi dran ??
Lemmy - Mi 26.02.03 12:42
Hi Hansa,
1. Select-Procedure (mit Rückgabewerten):
Quelltext
1:
| Select * from ProcedureName(Param1, Param2,..,ParamN); |
2. Ausführende Prozedur (ohne Rückgabewert):
Quelltext
1:
| Execute ProcudureName(Param1, Param2,...,ParamN); |
Mit anderen Worten: Wie bei ner Tabelle!
Grüße
Lemmy
Moderiert von
Tino: Code-Tags hinzugeüfgt.
hansa - Mi 26.02.03 12:47
also brauche ich die Komponente "StoredProcedure" gar nicht :?: Wozu ist die dann da :?:
LCS - Mi 26.02.03 13:15
Hi
| hansa hat folgendes geschrieben: |
| also brauche ich die Komponente "StoredProcedure" gar nicht :?: Wozu ist die dann da :?: |
In erster Linie um die Handhabung zu vereinfachen.
Gruss Lothar
hansa - Mi 26.02.03 13:26
| LCS hat folgendes geschrieben: |
| In erster Linie um die Handhabung zu vereinfachen. |
Dann formuliere ich die Frage eben anders :"Wie handhabe ich eine Stored Procedure in Delphi?" :shock:
LCS - Mi 26.02.03 13:55
Eigentlich ganz simpel. Der TStoredProc einfach die Datenbank zuordnen, Procedure auswählen, eventl. Eingabeparameter füllen und mit ExecProc ausführen und die Ergebnisse holen.
Wenn die Procedure allerdings ein Select-Erbniss liefert, musst du so verfahren wie Lemmy schon geschrieben hat.
Gruss Lothar
hansa - Mi 26.02.03 14:36
ich brauche etwas mehr Infos. :cry:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| BEGIN SELECT SUM(UMSATZMWST2), AVG(UMSATZMWST2), MIN(UMSATZMWST2), MAX(UMSATZMWST2) FROM RECKOPF WHERE RECHNNR < 1000 INTO :tot_budget, :avg_budget, :min_budget, :max_budget; SUSPEND; END |
Diese Prozedur soll mir halt für Testzwecke irgendwelche Daten liefern für alle Rechnungen mit nr < 1000. Wie soll ich jetzt am besten die Daten darstellen? Z.B. mit 4 DBtext, oder wie sonst ? Wie kriege ich die daten da rein. Sorry, aber ich bin gerade dabei verschiedene Aufgaben von meinem Programm auf den Server zu verlagern und hab die Dinger noch nicht benutzt.
hansa - Mi 26.02.03 15:03
So sieht die DFM aus :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| object pFIBStoredProc1: TpFIBStoredProc Database = pFIBDatabase1 ParamCheck = True SQL.Strings = (
'EXECUTE PROCEDURE TEST_PROCEDURE (?MAX_BUDGET, ?MIN_BUDGET, ?AVG' + '_BUDGET, ?TOT_BUDGET)') Transaction = pFIBTransaction1 StoredProcName = 'TEST_PROCEDURE' Left = 24 Top = 152 end |
In der DB-Prozedur verwende ich aber Select, hier steht jetzt EXECUTE drin. Ich denke, das soll ich so nicht machen :?: Ist das MAX_BUDGET kein Rückgabewert ? Was macht denn dann die Prozedur überhaupt ?
Lemmy - Mi 26.02.03 15:50
Hi,
wie ich schon geschrieben habe, muss bei einer Prozedur die einen oder mehrere Werte zurückliefert mit Select zugegriffen werden, was letztendlich heißt (zitat:"Mit anderen Worten: Wie bei ner Tabelle! ") in einer TIBQuery/TIBDataSet ein Select rein:
Select * from Test_Procedure;
Fertig!
Die Komponente TIBStoredProcedure ist demzufolge für rein ausführbare Procs ohne Rückgabewert!
Grüße
Lemmy
hansa - Mi 26.02.03 16:25
Habe die Procedure mal so umgebaut :
Quelltext
1: 2: 3: 4: 5: 6: 7:
| BEGIN SELECT SUM(UMSATZMWST2) FROM RECKOPF WHERE RECHNNR < :RECHNNRPAR INTO :tot_budget; SUSPEND; END |
Dabei habe ich :RECHNNRPAR als Input und tot:_budget als Output-Parameter angelegt. Das scheint so auch zu funktionieren, aber mein einfaches SelectSQL passt nun nicht mehr :
SELECT * FROM TEST_PROCEDURE "Parameter mismatch" Wie übergebe ich den Parameter RECHNNRPAR an die Procedure ?? Daran wirds wohl hängen. Und noch eine Frage am Rande, sollte man die Stored Procedures einsetzen, wo es nur geht, oder nur so ab und zu ?
Lemmy - Mi 26.02.03 17:37
| hansa hat folgendes geschrieben: |
| Und noch eine Frage am Rande, sollte man die Stored Procedures einsetzen, wo es nur geht, oder nur so ab und zu ? |
Hast wohl meine DB-Tutorial-Trilogie noch nicht vollständig gelesen :D
Parameterübergabe an Proc:
Select * from Procedurename(Param1, Param2, Param3,....);
Stored Procedures sollen überall dort eingesetzt werden wo es Sinn macht und das macht es i.d.R. fast immer!
Grüße
Lemmy
hansa - Mi 26.02.03 21:18
so gehts tatsächlich :mrgreen: :
| Zitat: |
procedure TForm1.Button1Click(Sender: TObject);
begin
pFIBDataSet1.close;
pFIBDataSet1.SelectSQL.Text := 'SELECT * FROM TEST_PROCEDURE ('+Edit1.Text+')';
pFIBDataSet1.open;
end;
|
Dank an Lemmy :!: na gut, dann muß noch eine kleine IB-Exception dran glauben und morgen die UDF.
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!