Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird StoredPorc und Feldname als Paramter (https://www.delphipraxis.net/100396-firebird-storedporc-und-feldname-als-paramter.html)

Jens Schumann 27. Sep 2007 18:05

Datenbank: Firebird • Version: 2.0 • Zugriff über: IBX

Firebird StoredPorc und Feldname als Paramter
 
Hallo,
ich möchte bei einer StoredProc den Feldnamen als Parameter übergeben und die Summe bilden.
Entweder Summe mit harter Feldvorgabe z.B. SUM(DEZ) oder nur :A_PERIODE ohne SUM funktioniert.

Wie kann ich beides kombinieren?

Code:
ALTER PROCEDURE "GET_VALUEA"
(
  "A_JAHR" INTEGER,
  "A_PERIODE" VARCHAR(15) CHARACTER SET ISO8859_1,
  "A_PARTNER" VARCHAR(15) CHARACTER SET ISO8859_1,
  "A_ENTITY" VARCHAR(15) CHARACTER SET ISO8859_1,
  "A_POSNR" VARCHAR(15) CHARACTER SET ISO8859_1,
  "A_BWA" VARCHAR(15) CHARACTER SET ISO8859_1,
  "A_VERSION" INTEGER
)
RETURNS
(
  "O_VALUE" DOUBLE PRECISION
)
AS
begin
  /*
  SELECT SUM(:A_PERIODE) FROM positiondata pd // Hier kommt der Fehler ISC ERROR CODE:335544569
                                                                       ISC ERROR MESSAGE:
                                                                       Dynamic SQL Error
                                                                       expression evaluation not supported
    WHERE (pd.jahr=:A_JAHR       AND
           pd.partner=:A_PARTNER AND
           pd.entity=:A_ENTITY   AND
           pd.posnr=:A_POSNR     AND
           pd.bwa=:A_BWA         AND
           pd.ver=:A_VERSION)
    INTO :O_VALUE;
  */
  SUSPEND;
end

Dax 27. Sep 2007 18:18

Re: Firebird StoredPorc und Feldname als Paramter
 
Versuch es mal mit
SQL-Code:
execute statement 'sql-string' into :O_VALUE;
Edit: noch ein Link

Jens Schumann 28. Sep 2007 08:36

Re: Firebird StoredPorc und Feldname als Paramter
 
Hallo Dax,
nach einigem Probieren bin ich bei folgender Syntax angekommen
Code:
ALTER PROCEDURE "GET_VALUE"
(
  "A_JAHR" INTEGER,
  "A_ENTITY" VARCHAR(15) CHARACTER SET ISO8859_1,
  "A_POSNR" VARCHAR(15) CHARACTER SET ISO8859_1
)
RETURNS
(
  "A_VALUE" DOUBLE PRECISION
)
AS
DECLARE VARIABLE L_VER INTEGER;
DECLARE VARIABLE L_DEZ VARCHAR(3);
begin
  L_DEZ = 'DEZ';
  SELECT id FROM versionen WHERE aktive=1 INTO :L_VER;

  EXECUTE STATEMENT 'SELECT SUM('||:L_DEZ||') AS DEZ FROM positiondata pd
          WHERE (pd.jahr='||:A_JAHR||' AND pd.entity='||:A_ENTITY ||' AND
                 pd.posnr='||:A_POSNR||' and pd.ver='||:L_VER||') '
          INTO :A_VALUE;

  SUSPEND;
end
Das wird compiliert. Zur Laufzeit wird jedoch ein Fehler ausgegeben.
Parameter:
A_JAHR = 2007
A_ENTITY = 100132
A_POSNR = GV5031001110

Code:
Dynamic SQL Error
SQL error code = -206
Column unknown
GV5031001110
At line 3, column 40
Es sieht so aus, als ob der Parameter A_POSNR als Spalte interpretiert wird :gruebel:

Wenn ich dem Beispiel deines Links folge und die | nicht verwende erhalte ebenfalls einen Fehler:
Code:
ISC ERROR CODE:335544569

ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -206
Column unknown
A_JAHR
At line 2, column 27
Dann habe ich versucht die Parameter über values mitzugeben.
Code:
  EXECUTE STATEMENT 'SELECT SUM(:L_DEZ) AS DEZ FROM positiondata pd
          WHERE (pd.jahr=:A_JAHR AND pd.entity= :A_ENTITY AND
                 pd.posnr=:A_POSNR and pd.ver=:L_VER) '
          INTO :A_VALUE VALUES :L_DEZ,:A_JAHR,:A_ENTITY,:A_POSNR,:L_VER;
Das erzeugt schon beim compilieren einen Fehler
Code:
ISC ERROR CODE:335544569

ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 15, column 25
VALUES

hoika 28. Sep 2007 09:27

Re: Firebird StoredPorc und Feldname als Paramter
 
Hallo,


in Delphi-Code würde dein sql so aussehen

Delphi-Quellcode:
var
  A_Jahr : Integer
  sSQL  : String;
begin
sSQL:= ..+'WHERE (pd.jahr='+'A_Jahr'
Du übergibst also nicht die Werte.

Ich würde lokale Variablen benutzen.

[/sql]
S_Jahr char(4);

S_Jahr = cast(:A_Jahr as char (4));

und dann das s_Jahr zum zusammenbauen des Statements benutzen

WHERE (pd.jahr || S_Jahr ||
[sql]


Heiko

TBx 28. Sep 2007 09:50

Re: Firebird StoredPorc und Feldname als Paramter
 
Dir fehlen in Deinem SQL-Statement die Anführungszeichen um A_ENTITY und A_POSNR.
Diese sind Varchars und müssen daher im Statement auch in Anführungszeichen stehen.
Schau Dir am besten einfach mal das Statement an, das Du da ausführen lassen willst.
Ich bau mir solche Statements immer in einer Variablen zusammenn und lasse dann den Inhalt der Variablen über Execute Statement (VARIABLE) ausführen.
Hat den Vorteil, dass ich mir im IBExpert Stored-Procedure-Debugger schnell mal ansehen kann, was ich denn da tatsächlich für ein Statement zusammenbastele.

Hope it helps

Thomas

Jens Schumann 28. Sep 2007 12:06

Re: Firebird StoredPorc und Feldname als Paramter
 
Zitat:

Zitat von onlinekater
Dir fehlen in Deinem SQL-Statement die Anführungszeichen um A_ENTITY und A_POSNR.
Diese sind Varchars und müssen daher im Statement auch in Anführungszeichen stehen.

Das verstehe ich nicht. Schau Dir bitte mal meinen ersten Beitrag an. Wenn man in der Procedure SUM(:A_PERIODE)
mit SUM(DEZ) ersetzt läuft es einwandfrei. Ganz ohne Anführungszeichen um A_ENTITY und A_POSNR.

TBx 28. Sep 2007 12:34

Re: Firebird StoredPorc und Feldname als Paramter
 
Zitat:

Zitat von Jens Schumann
SQL-Code:
EXECUTE STATEMENT 'SELECT SUM('||:L_DEZ||') AS DEZ FROM positiondata pd
          WHERE (pd.jahr='||:A_JAHR||' AND pd.entity='||:A_ENTITY ||' AND
                 pd.posnr='||:A_POSNR||' and pd.ver='||:L_VER||') '
          INTO :A_VALUE;
Parameter:
A_JAHR = 2007
A_ENTITY = 100132
A_POSNR = GV5031001110

L_DEZ definierst Du in der Stored Procedure als Dez.
L_Ver nehme ich jetzt mal als 1 an.

Dann sieht das Stetement so aus:
SQL-Code:
SELECT SUM(Dez) as DEZ
     FROM positiondata pd
     WHERE (pd.jahr=2007 
       AND pd.entity=100132
       AND pd.posnr=GV5031001110
       AND pd.ver=1)
korrekt müßte es lauten:
SQL-Code:
SELECT SUM(Dez) as DEZ
     FROM positiondata pd
     WHERE (pd.jahr=2007 
       AND pd.entity='100132'
       AND pd.posnr='GV5031001110'
       AND pd.ver=1)
Die fehlenden Anführungeszeichen bei AND pd.entity=100132 fallen nicht ins gewicht, da die automatische Typumwandlung den gewünschten Wert zurückgibt.
Aber in der Zeile AND pd.posnr=GV5031001110 wird GV5031001110 als Feld interpretiert, das der Varchar nicht wie vorgesehen in Hochkomma eingeschlossen ist.

Ich hoffe, etwas Licht ins Dunkel gebracht zu haben.

onlinekater

Jens Schumann 28. Sep 2007 13:19

Re: Firebird StoredPorc und Feldname als Paramter
 
Hallo Thomas,
ich gestehe: Ich habe ein Brett vor dem Kopf.
Ich bekomme es nicht hin, dass die ' dort stehen wo sie hingehören.
Hättest Du bitte mal ein Beispiel für mich?

TBx 28. Sep 2007 13:29

Re: Firebird StoredPorc und Feldname als Paramter
 
SQL-Code:
EXECUTE STATEMENT 'SELECT SUM('||:L_DEZ||') AS DEZ FROM positiondata pd
          WHERE (pd.jahr='||:A_JAHR||' AND pd.entity='''||:A_ENTITY ||''' AND
                 pd.posnr='''||:A_POSNR||''' and pd.ver='||:L_VER||') '
          INTO :A_VALUE;
Sollte funktionieren, wenn ich mich nicht vertippselt habe.

Gruß

Thomas

Jens Schumann 28. Sep 2007 13:31

Re: Firebird StoredPorc und Feldname als Paramter
 
Hallo Thomas,
vielen Dank. Auf drei ' wäre ich jetzt nicht gekommen. Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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-2025 by Thomas Breitkreuz