![]() |
Datenbank: FireBird • Version: 1.5 • Zugriff über: FireBird .Net DataProvider (in dem Fall aber uninteressant)
FireBird's native dynamic SQL und Variablen
Moin FB'ler (innen) :hi:
Wie sollt's nicht anders sein... Ich stehe mal wieder auf dem Schlauch. :mrgreen: Ich würde gerne per dynamic SQL unter Angabe des Tabellennamens den nächsten Wert aus dem Generator bekommen. Dumm ist nur, dass ich NIRGENDS finden kann wie man Variablen in einem dynamischen Block deklariert. :shock: Die Doku von FireBird schweigt sich hier aus. (wie bei eigentlich allem anderem auch :? ) Ich habe es also zuerst so probiert: (rein "experimentelles Konstrukt" ohne ExceptionHandling & Co... ;) )
Delphi-Quellcode:
:arrow: Fehler!
create procedure GetID (TableName varchar(55))
returns (NewID integer) as begin execute statement 'declare variable NewID integer; '|| 'begin '|| ' :NewID = GEN_ID(GEN_'|| :TableName ||'_ID,1); '|| 'end;' into :NewID; suspend; end Weitere erfolglose Versuche:
Weiß hier jemand: Wie ich Variablen in einem dynamischen Block deklarieren und verwenden kann? Firebird springt ja gerne zwischen den Schreibweisen :[Var] & [Var] hin und her. :freak: |
Re: FireBird's native dynamic SQL und Variablen
Moin Robert,
so wie ich Dich verstanden habe möchtest Du über eine Stored Procedure den nächten Generatorwert holen. Ich verwende dafür folgenden Code.
SQL-Code:
GEN_KONSOTREE ist der Generator.
SET TERM ^ ;
CREATE PROCEDURE "GET_ID" RETURNS ( "NEWID" INTEGER ) AS BEGIN NewID = GEN_ID(GEN_KONSOTREE,1); END ^ SET TERM ; ^ [Edit] Habe Deine Frage erst jetzt richtig verstanden. Das muss ich ausprobieren [/Edit] |
Re: FireBird's native dynamic SQL und Variablen
@Jens
Du bist lustig. :mrgreen: Die Generatoren heißen jedesmal anders. (Du weißt schon Standardnamen aus IbExpert :zwinker: ). Deine Lösung wäre ja kein Problem für mich. |
Re: FireBird's native dynamic SQL und Variablen
Zitat:
|
Re: FireBird's native dynamic SQL und Variablen
Moin Robert,
SQL-Code:
MfG
SET TERM ^ ;
CREATE PROCEDURE GETID (TableName VARCHAR(55)) RETURNS (NewID BIGINT) AS BEGIN EXECUTE STATEMENT 'SELECT GEN_ID(GEN_'||:TableName||'_ID,1) FROM RDB$DATABASE' INTO :NewID; SUSPEND; END ^ SET TERM ; ^ Stevie |
Re: FireBird's native dynamic SQL und Variablen
Ich habe es jetzt so gelöst.
Delphi-Quellcode:
Die Fragestellung bleibt aber weiterhin.
create procedure GetID (TableName varchar(55))
returns (NewID bigint) as begin execute statement 'SELECT GEN_ID(GEN_'|| :TableName ||'_ID,1) FROM Rdb$Database' into :NewID; suspend; end Denn
|
Re: FireBird's native dynamic SQL und Variablen
Zitat:
|
Re: FireBird's native dynamic SQL und Variablen
Klar geht das in Oracle! Was bringen die dir denn in deiner Ausbildung bei? :shock:
Delphi-Quellcode:
Das geht sogar mit Collections bzw. JEDEM Typen, mit dem die SQL engine umgehen kann. ;)
declare
Var1 Integer := 1; begin execute immediate 'begin'||Chr(10)|| ' :var := :var +1;'||Chr(10)|| 'end;' using Var1; end; Aber darum geht es hier nicht... In IB/FB werden Ergebnismengen aus SQL Statements per pipes durchgeschleust. Das finde ich totalen Overkill für einen simplen Integer. Deshalb finde ich es hässlich. ;) Aber ich scheine diese ganzen Artikel zu FB1.5 falsch verstanden zu haben... FB kann das anscheinend tatsächlich nur per SELECT. ...Frage geklärt :( |
Re: FireBird's native dynamic SQL und Variablen
Wenn du noch
SQL-Code:
schreiben würdest, dann würd das Skript sogar funktionieren... :-P
using out
Ok, ich geb mich geschlagen, aber das wusste noch nichtmal mein Kollege, der sich wirklich gut auskennt - naja, wahrscheinlich, weil wir sowas nie benötigen... ;-) Edit: bzw
SQL-Code:
nachdem du's nochmal geändert hast...
in out
|
Re: FireBird's native dynamic SQL und Variablen
eigentlich in out, aber ich habe es nur schnell runtergehackt. ;)
Nachtrag: hihi, schon wieder überschnitten :lol: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 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