Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FireBird's native dynamic SQL und Variablen (https://www.delphipraxis.net/40316-firebirds-native-dynamic-sql-und-variablen.html)

Robert_G 14. Feb 2005 10:06

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:
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
:arrow: Fehler!
Weitere erfolglose Versuche:
  • Delphi-Quellcode:
    execute statement 'declare variable NewID integer; '||
                      'begin '||
                      ' NewID = GEN_ID(GEN_'|| :TableName||'_ID,1); '||
                      'end;'
      into :NewID;
  • Delphi-Quellcode:
    execute statement 'begin '||
                      ' :NewID = GEN_ID(GEN_'|| :TableName||'_ID,1); '||
                      'end;'
      into :NewID;
  • Delphi-Quellcode:
    execute statement ' :NewID = GEN_ID(GEN_'|| :TableName||'_ID,1)'
      into :NewID;

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:

Jens Schumann 14. Feb 2005 10:10

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:
SET TERM ^ ;
CREATE PROCEDURE "GET_ID"
RETURNS
(
  "NEWID" INTEGER
)
AS
BEGIN
  NewID = GEN_ID(GEN_KONSOTREE,1);
END
 ^
SET TERM ; ^
GEN_KONSOTREE ist der Generator.
[Edit] Habe Deine Frage erst jetzt richtig verstanden. Das muss ich ausprobieren [/Edit]

Robert_G 14. Feb 2005 10:12

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.

Jens Schumann 14. Feb 2005 10:15

Re: FireBird's native dynamic SQL und Variablen
 
Zitat:

Zitat von Robert_G
@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.

Tut mir Leid, habe deine Frage erst jetzt korrekt verstanden. Muss ich mal testen.

Stevie 14. Feb 2005 10:30

Re: FireBird's native dynamic SQL und Variablen
 
Moin Robert,

SQL-Code:
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 ; ^
MfG
Stevie

Robert_G 14. Feb 2005 10:31

Re: FireBird's native dynamic SQL und Variablen
 
Ich habe es jetzt so gelöst.
Delphi-Quellcode:
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
Die Fragestellung bleibt aber weiterhin.
Denn
  1. finde ich die Lösung sehr hässlich
  2. werde ich dyn. SQL mit Variablen sicher sehr schnell wirklich brauchen. :mrgreen:
Nachtrag: :lol: das war mal überschneidend geantwortet...

Stevie 14. Feb 2005 10:55

Re: FireBird's native dynamic SQL und Variablen
 
Zitat:

Zitat von Robert_G
Die Fragestellung bleibt aber weiterhin.
Denn
  1. finde ich die Lösung sehr hässlich
  2. werde ich dyn. SQL mit Variablen sicher sehr schnell wirklich brauchen. :mrgreen:

  1. Die Lösung ist nicht hässlich, sondern imho die einzige, die funktioniert! ;-)
  2. Ich glaub nicht, dass das funktioniert, was du versuchst. Du kannst nur Werte aus einem dynamischen SQL herausholen, wenn du eine Datenmenge hast (wie bei dem Fall oben über ein SELECT-Statement) und nicht einfach ein Skript ausführen und dir hinterher die Werte der im Skript benutzten Variablen holen. Wie sollte das schließlich gehen? Sowas funktioniert imho noch nichtmal bei Oracle - und da geht schon viel. ;-)

Robert_G 14. Feb 2005 11:05

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:
declare
  Var1 Integer := 1;
begin
  execute immediate
    'begin'||Chr(10)||
    ' :var := :var +1;'||Chr(10)||
    'end;'
  using Var1;
end;
Das geht sogar mit Collections bzw. JEDEM Typen, mit dem die SQL engine umgehen kann. ;)

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 :(

Stevie 14. Feb 2005 11:16

Re: FireBird's native dynamic SQL und Variablen
 
Wenn du noch
SQL-Code:
using out
schreiben würdest, dann würd das Skript sogar funktionieren... :-P
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:
in out
nachdem du's nochmal geändert hast...

Robert_G 14. Feb 2005 11:19

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