AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird: Generator mit dynamischen Namen
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird: Generator mit dynamischen Namen

Ein Thema von MrSpock · begonnen am 31. Aug 2015 · letzter Beitrag vom 1. Sep 2015
Antwort Antwort
Seite 3 von 3     123   
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#21

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 14:31
Ohne expliziten Lock der Tabelle könnte es passieren, dass 2 gleichzeitige Vorgänge 2 identische Nummern generiert!
Da passiert eben nichts. Ich will ja nicht streiten oder Spocki Vorschriften machen, aber Transaktionskontrolle muss sein. Ich habe umfangreiche Tests durchgeführt. Sowohl für diese Recnr-SP als auch für normale Datensätze, also Updates über Delphi-Programm. 3 Rechner : der erste speichert so schnell er kann. Der zweite lässt sich eine Sek. Zeit, der dritte sogar 2 Sek. Das Ganze übers Wochenende. Bei dem Table-Update habe ich dafür gesorgt, dass die 3 Rechner nur auf drei Datensätze Updates gemacht haben. Nach menschlichem Ermessen und einem nicht wasserdichten System hätte da bei über 60 St. Laufzeit irgendwo ein Konflikt auftauchen müssen. Zumindest sind sie sich wohl schon irgendwo ins Gehege gekommen. Sonntag mittags hat mich dann die Neugier gepackt und was war ? Kein Fehler, nichts. Das mit dem Lock, das scheint überflüssig zu sein.

Hat mich dann auch nicht gewundert, dass Montag morgens immer noch nichts war. Firebird geht schon gut. Für Netzwerk ist nur wichtig : richtige Transaktionskontrolle.
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 14:49
Vielleicht nur Glück oder durch das verwendete MP bedingt. Ich würde das aber an Deiner Stelle ändern, denn ab FB3 könnte das dann schön in dei Hose gehen.
Markus Kinzler
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#23

AW: Firebird: Generator mit dynamischen Namen

  Alt 31. Aug 2015, 20:12
Also bei einer derartigen Konstellation würde ich wirklich empfehlen, eine eigene Funktion dafür zu schreiben. Anhand einer Hilfstabelle werden die Zähler verwaltet. Da das Ganze eh in einer Transaktion ausgeführt wird, sind Dopplungen ausgeschlossen.

Wenn Du einen Generator verwendest, machst Du dich imho implizit von der Implementierung des Generators abhängig bzw. von etwaigen Restriktionen. Das ist zwar hier nicht der Fall, aber unsauber. Finde ich.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#24

AW: Firebird: Generator mit dynamischen Namen

  Alt 1. Sep 2015, 23:02
Jetzt hab ich es "fast" so, wie ich es haben wollte. Meine SP sieht wie folgt aus:

Code:
CREATE OR ALTER procedure GET_ERFNR (
    JAHR varchar(2) not null,
    WOCHE varchar(2) not null)
returns (
    ERFNR integer)
as
declare variable ANZ integer;
declare variable GEN_NAME varchar(10);
begin
  /* Procedure Text */
  gen_name = 'ERFNR' || Jahr || Woche;

  SELECT COUNT(1) from rdb$generators where rdb$generator_name = :gen_name into :anz;

  if (anz <> 1) then
    execute statement 'create sequence ' || gen_name;

  execute statement 'SELECT GEN_ID(' || gen_name || ', 1) from rdb$database';
  suspend;
end
Ich prüfe als, ob z.B. der Generator ERFNR1503 schon existiert und wenn nicht, erstelle ich ihn. Funktioniert einwandfrei.
Jetzt brauche ich nur noch den nächsten Wert üner GEN_ID, dazu habe ich die zweite execute statement Anweisung. Ich muss aber den Wert von dem Generator als Wert der SP zurückgeben, aber das will nicht funktionieren. Ich kann weder den Wert über "SELECT GE_ID ... into :ERFNR" noch über ERFNR = execute statement 'SELECT ...' oder über execute statement 'ERFNR = SELECT ...' in ERFNR zurückgeben.

Hat jemand eine Idee, wie ich den Wert des zweiten EXECUTE Statements zurückgebe?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
bepe

Registriert seit: 17. Okt 2006
119 Beiträge
 
#25

AW: Firebird: Generator mit dynamischen Namen

  Alt 1. Sep 2015, 23:10
Das kannst du mit execute into machen:

http://www.firebirdsql.org/refdocs/l...-execstat.html

mfg,
bp
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#26

AW: Firebird: Generator mit dynamischen Namen

  Alt 1. Sep 2015, 23:12
Genial!

Das hat mir noch gefehlt, jetzt funktioniert es:

Code:
CREATE OR ALTER procedure GET_ERFNR (
    JAHR varchar(2) not null,
    WOCHE varchar(2) not null)
returns (
    ERFNR integer)
as
declare variable ANZ integer;
declare variable GEN_NAME varchar(10);
begin
  /* Procedure Text */
  gen_name = 'ERFNR' || Jahr || Woche;

  SELECT COUNT(1) from rdb$generators where rdb$generator_name = :gen_name into :anz;

  if (anz <> 1) then
    execute statement 'create sequence ' || gen_name;

  execute statement 'SELECT GEN_ID(' || gen_name || ', 1) from rdb$database' into :erfnr;
  suspend;
end
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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