![]() |
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 |
Re: Firebird StoredPorc und Feldname als Paramter
|
Re: Firebird StoredPorc und Feldname als Paramter
Hallo Dax,
nach einigem Probieren bin ich bei folgender Syntax angekommen
Code:
Das wird compiliert. Zur Laufzeit wird jedoch ein Fehler ausgegeben.
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 Parameter: A_JAHR = 2007 A_ENTITY = 100132 A_POSNR = GV5031001110
Code:
Es sieht so aus, als ob der Parameter A_POSNR als Spalte interpretiert wird :gruebel:
Dynamic SQL Error
SQL error code = -206 Column unknown GV5031001110 At line 3, column 40 Wenn ich dem Beispiel deines Links folge und die | nicht verwende erhalte ebenfalls einen Fehler:
Code:
Dann habe ich versucht die Parameter über values mitzugeben.
ISC ERROR CODE:335544569
ISC ERROR MESSAGE: Dynamic SQL Error SQL error code = -206 Column unknown A_JAHR At line 2, column 27
Code:
Das erzeugt schon beim compilieren einen Fehler
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;
Code:
ISC ERROR CODE:335544569
ISC ERROR MESSAGE: Dynamic SQL Error SQL error code = -104 Token unknown - line 15, column 25 VALUES |
Re: Firebird StoredPorc und Feldname als Paramter
Hallo,
in Delphi-Code würde dein sql so aussehen
Delphi-Quellcode:
Du übergibst also nicht die Werte.
var
A_Jahr : Integer sSQL : String; begin sSQL:= ..+'WHERE (pd.jahr='+'A_Jahr' 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 |
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 |
Re: Firebird StoredPorc und Feldname als Paramter
Zitat:
mit SUM(DEZ) ersetzt läuft es einwandfrei. Ganz ohne Anführungszeichen um A_ENTITY und A_POSNR. |
Re: Firebird StoredPorc und Feldname als Paramter
Zitat:
L_Ver nehme ich jetzt mal als 1 an. Dann sieht das Stetement so aus:
SQL-Code:
korrekt müßte es lauten:
SELECT SUM(Dez) as DEZ
FROM positiondata pd WHERE (pd.jahr=2007 AND pd.entity=100132 AND pd.posnr=GV5031001110 AND pd.ver=1)
SQL-Code:
Die fehlenden Anführungeszeichen bei AND pd.entity=100132 fallen nicht ins gewicht, da die automatische Typumwandlung den gewünschten Wert zurückgibt.
SELECT SUM(Dez) as DEZ
FROM positiondata pd WHERE (pd.jahr=2007 AND pd.entity='100132' AND pd.posnr='GV5031001110' AND pd.ver=1) 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 |
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? |
Re: Firebird StoredPorc und Feldname als Paramter
SQL-Code:
Sollte funktionieren, wenn ich mich nicht vertippselt habe.
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; Gruß Thomas |
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