Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird: SP1 ruft SP2 auf (SP2 enthält For Select) (https://www.delphipraxis.net/139136-firebird-sp1-ruft-sp2-auf-sp2-enthaelt-select.html)

hoika 24. Aug 2009 13:51

Datenbank: Firebird • Version: 1.5 • Zugriff über: egal

Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Hallo #,

kniffliges Problem.

Ich habe eine SP1.
Der wird ein Datum übergeben.

SP2 hat einen fast identischen Code,
nur wird dort statt dem Dateum 'Now' (Current_Date) benutzt.

Es sind selectable SP's.

SQL-Code:
CREATE PROCEDURE SP_GETBASECOSTCENTER2 
RETURNS (
    THEPERSONALID INTEGER,
    THEPERSONALNAME VARCHAR(30),
    THEPERSONALFIRSTNAME VARCHAR(20),
    THECOSTCENTERID INTEGER,
    THECOSTCENTERNO VARCHAR(20),
    THECOSTCENTERNAME VARCHAR(100))
AS
begin
  execute Procedure SP_GETBASECOSTCENTER1('Now')
    Returning_Values
    (THEPERSONALID,THEPERSONALNAME,THEPERSONALFIRSTNAME,
    THECOSTCENTERID,THECOSTCENTERNO,THECOSTCENTERNAME);

  suspend;

end
Das blöde ist jatzt aber.
Es wird nur der 1. Datensatz zurückgegeben (das ist das eine suspend hier),
obwohl in der SP_GETBASECOSTCENTER1 per

For Select do
begin
suspend
end;

mehrere Datensätze zurückgegeben werden.

Ist ja auch klar, weil ich kein Recordset als Return-Parameter habe,
sindern nur einfache Variablen.

Aber was mache ich denn jetzt (unter FB1.5).

Unter FB2x könnte ich temporäre Tabellen benutzen oder jetzt neu Default-Parameter.


Heiko

mkinzler 24. Aug 2009 14:02

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Versuch mal
SQL-Code:
CREATE PROCEDURE SP_GETBASECOSTCENTER2
RETURNS (
    THEPERSONALID INTEGER,
    THEPERSONALNAME VARCHAR(30),
    THEPERSONALFIRSTNAME VARCHAR(20),
    THECOSTCENTERID INTEGER,
    THECOSTCENTERNO VARCHAR(20),
    THECOSTCENTERNAME VARCHAR(100))
AS
begin
  for select
      * 
  from
      SP_GETBASECOSTCENTER1('Now')
  into
    :THEPERSONALID,:THEPERSONALNAME,:THEPERSONALFIRSTNAME,
    :THECOSTCENTERID,:THECOSTCENTERNO,:THECOSTCENTERNAME do
  begin
      suspend;
  end
end

hoika 24. Aug 2009 14:14

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Hallo,

ahhh, clever !
Hätte ich selber draufkommen sollen. ;)

For Select * geht zwar nicht,
du musst die Felder angeben.


#Update#
* geht doch. Ist ja sehr verwunderlich.


#Update 2#
Hm, ich benutze zur Optimierung den IB Planalyzer.
Der bringt mir einen Fehler, dass der Plan (Query-Plan) nicht stimmt.
Auch IBExpert zeigt mir nur PLAN an.

Scheint aber ein Problem von FB1.5 zus ein, der 2.1er zeigt den Plan.

Egal: looft.


Danke


Heiko

Elvis 24. Aug 2009 21:06

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Zitat:

Zitat von hoika
#Update#
* geht doch. Ist ja sehr verwunderlich.

Nö, es ist halt vollkommen egal was irgendein Tool behauptet. Nur ob die DB es mag ist interessant.
Anscheinend sind die Aussagen deiner beiden Tools n der Richtung wohl nicht zuverlässig. ;-)

hoika 25. Aug 2009 07:11

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Hallo,

Moment ;)

Ich habe mich nur gewundert, das FB ein Select * genau hier erlaubt.
Sonst ist PSQL doch sehr pingelig, was ja auch gut ist ;).
Stimmt schon, IBExpert prüft SP's ja vorher auch noch ab.
Kann auch sein, dass es in IB6 noch nicht ging.

Ich hätte nicht gedacht, dass das Select * geht,
weil sonst immer die Felder genau definiert werden müssen.
Die Feld-Reihenfolge ist ja per SQL-Standard bei Select* nicht definiert,
aber ich schreibe die ja per Into in eine genau definierte Variablen-Reihenfolge.

Das hatte mich gewundert.


Heiko

IBExpert 25. Aug 2009 07:12

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Zitat:

Zitat von Elvis
Zitat:

Zitat von hoika
#Update#
* geht doch. Ist ja sehr verwunderlich.

Nö, es ist halt vollkommen egal was irgendein Tool behauptet. Nur ob die DB es mag ist interessant.
Anscheinend sind die Aussagen deiner beiden Tools n der Richtung wohl nicht zuverlässig. ;-)

wenn man weiss, wo all diese Tools den Plan herbekommen, dann kann man dazu auch Kommentare
abgeben, wenn man das nicht weiss, wie in diesem Fall offentsichtlich, dann sollte man das
auch nicht kommentieren.

Firebird selbst liefert via API den Plan zu einem Statement zurück, und wenn die Firebird
Version nun mal nichts liefert, dann zeigen die Tools auch nichts an.

IBExpert 25. Aug 2009 07:16

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Zitat:

Zitat von hoika
Hallo,

Ich habe mich nur gewundert, das FB ein Select * genau hier erlaubt.
Sonst ist PSQL doch sehr pingelig, was ja auch gut ist ;).
Stimmt schon, IBExpert prüft SP's ja vorher auch noch ab.
Kann auch sein, dass es in IB6 noch nicht ging.

Ich hätte nicht gedacht, dass das Select * geht,
weil sonst immer die Felder genau definiert werden müssen.
Die Feld-Reihenfolge ist ja per SQL-Standard bei Select* nicht definiert,
aber ich schreibe die ja per Into in eine genau definierte Variablen-Reihenfolge.

Das hatte mich gewundert.


Heiko

select * geht immer wenn zur compilezeit die anzahl der Felder passt, wenn diese sich aber mal
ändern sollte, dann bekommmst du spätestens beim neukompilieren ein Problem, deshalb
immer in Prozeduren die Feldnamen auflösen und auf * verzichten.

hoika 25. Aug 2009 07:21

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Hallo,

Einspruch ;)
Nicht nur die Anzahl der Felder muss stimmen,
auch der Feldtyp.
Ein Select Int_Feld Into :Var_Feld geht nicht.

Ist ja auch egal ;)

Ich habe aus Vorsichtsgründen das Select*
durch Select Feld1, Feld 2 .. ersetzt.

Und es looft ja auch.


Noch mal zum Plan:
Bei FB2.X kommt bei SP1 ein NATURAL (SP2) raus,
bei FB1.5 nix.
Ist wohl ein Bug.


Heiko

IBExpert 25. Aug 2009 07:31

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Zitat:

Zitat von hoika
Hallo,

Einspruch ;)
Nicht nur die Anzahl der Felder muss stimmen,
auch der Feldtyp.
Ein Select Int_Feld Into :Var_Feld geht nicht.

Ist ja auch egal ;)

...

selber einspruch ;)

die Parameter und die Inhalte müssen kompatibel sein, du kannst sehrwohl integer in varchar packen,
auch umgekehrt geht das, wenn im varchar was zu integer kompatibles steht. Firebird ist da extrem
flexibel, führt aber manchmal zu Schlampigkeit, die sich erst beim Endkunden rächt.

hoika 25. Aug 2009 07:48

Re: Firebird: SP1 ruft SP2 auf (SP2 enthält For Select)
 
Hallo,

re ;)
neh, geht nicht.
Probier es einfach mal aus.
Zumindestens in einer SP klappt das nicht,
es sei denn es wird gecastet.


Hieko


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz