AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird StoredPorc und Feldname als Paramter
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird StoredPorc und Feldname als Paramter

Ein Thema von Jens Schumann · begonnen am 27. Sep 2007 · letzter Beitrag vom 28. Sep 2007
Antwort Antwort
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#1

Firebird StoredPorc und Feldname als Paramter

  Alt 27. Sep 2007, 19:05
Datenbank: Firebird • Version: 2.0 • Zugriff über: IBX
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
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 27. Sep 2007, 19:18
Versuch es mal mit execute statement 'sql-stringinto :O_VALUE; Edit: noch ein Link
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 09:36
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

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
I come from outer space to save the human race
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 10:27
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
Heiko
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#5

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 10:50
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
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 13:06
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#7

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 13:34
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
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 14:19
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?
I come from outer space to save the human race
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#9

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 14:29
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
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Firebird StoredPorc und Feldname als Paramter

  Alt 28. Sep 2007, 14:31
Hallo Thomas,
vielen Dank. Auf drei ' wäre ich jetzt nicht gekommen. Danke
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz