AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireBird's native dynamic SQL und Variablen
Thema durchsuchen
Ansicht
Themen-Optionen

FireBird's native dynamic SQL und Variablen

Ein Thema von Robert_G · begonnen am 14. Feb 2005 · letzter Beitrag vom 14. Feb 2005
Antwort Antwort
Robert_G
(Gast)

n/a Beiträge
 
#1

FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 10:06
Datenbank: FireBird • Version: 1.5 • Zugriff über: FireBird .Net DataProvider (in dem Fall aber uninteressant)
Moin FB'ler (innen)

Wie sollt's nicht anders sein... Ich stehe mal wieder auf dem Schlauch.

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.
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
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.
  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
 
#2

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 10:10
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]
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#3

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 10:12
@Jens
Du bist lustig.
Die Generatoren heißen jedesmal anders. (Du weißt schon Standardnamen aus IbExpert ).
Deine Lösung wäre ja kein Problem für mich.
  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
 
#4

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 10:15
Zitat von Robert_G:
@Jens
Du bist lustig.
Die Generatoren heißen jedesmal anders. (Du weißt schon Standardnamen aus IbExpert ).
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 10:30
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$DATABASEINTO :NewID;
  SUSPEND;
END
^
SET TERM ; ^
MfG
Stevie
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#6

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 10:31
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.
Nachtrag: das war mal überschneidend geantwortet...
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 10:55
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.
  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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#8

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 11:05
Klar geht das in Oracle! Was bringen die dir denn in deiner Ausbildung bei?
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 11:16
Wenn du noch using out schreiben würdest, dann würd das Skript sogar funktionieren...
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 in out nachdem du's nochmal geändert hast...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#10

Re: FireBird's native dynamic SQL und Variablen

  Alt 14. Feb 2005, 11:19
eigentlich in out, aber ich habe es nur schnell runtergehackt.
Nachtrag: hihi, schon wieder überschnitten
  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 08:50 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