Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Generator zurücksetzen aus StoredProcedure (https://www.delphipraxis.net/146328-generator-zuruecksetzen-aus-storedprocedure.html)

DirkG 18. Jan 2010 09:19

Datenbank: Interbase • Version: 5 • Zugriff über: intern

Generator zurücksetzen aus StoredProcedure
 
Hallo DP'ler.

Wieder mal ein Problem mit Stored Procedure

Ich würde gerne mit einer Procedur alle Datensätze einer Veranstaltung aus der Datenbank löschen, was auch schon läuft. Nun kommt das Problem. Um den Generator für die DS ID nicht unnötig zu erhöhen, wollte ich nach dem Löschen, den Generator auf den nächsten verfügbaren Wert setzen. Leider meckert Interbase rum und meint das er das Kommando nicht kennt. Wie ist der korrekte Syntax?

SQL-Code:
SET TERM ^ ;

/* Stored procedures */
CREATE PROCEDURE RESETRUNS
( EVENTID INTEGER )
AS
 DECLARE VARIABLE NewGen INT;
BEGIN
  DELETE FROM RUNS WHERE (RUN_EVENT =:EVENTID);
  SELECT MAX(RUN_ID)+1 FROM RUNS INTO :NewGen ;
  /* hier kommt der Fehler */
  SET GENERATOR GEN_RUN TO :NewGen;
END
 ^

SET TERM ; ^
Ach ja wenn es weiterhilft, die Fehlermeldung lautet:
SQL-Code:
  Dynamic SQL Error
  SQL error code = -104
  Token unknown - line 10, char 1
  SET ...
Vielen Dank!

TBx 18. Jan 2010 09:30

Re: Generator zurücksetzen aus StoredProcedure
 
mal davon abgesehen, dass ich so eine Generatorveränderung nicht machen würde, lautet die korrekte Syntax in deinem fall:

SQL-Code:
gen_id (GEN_RUNS, -(gen_id(GEN_RUNS, 0)- :NewGen));

DirkG 18. Jan 2010 11:40

Re: Generator zurücksetzen aus StoredProcedure
 
Hey Danke für die schnelle Antwort.

Ich habe die Procedur nun so geändert. Aber die IB Console meckert immer noch, wenn ich dieses Statement in der IB-Console eingebe:

SQL-Code:
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */
ALTER PROCEDURE RESETRUNS
(
  EVENTID INTEGER
)
AS
 DECLARE VARIABLE NewGen INT;
BEGIN
  DELETE FROM RUNS WHERE (RUN_EVENT =:EVENTID);

  SELECT MAX(RUN_ID)+1 FROM RUNS INTO :NewGen ;
 
  /* SET GENERATOR GEN_RUN TO :NewGen; */
  /* immer noch Fehlermeldung */
  GEN_ID (GEN_RUNS, :NewGen);
  GEN_ID (GEN_RUNS, 0);
 
END
 ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
Fehlermeldung ist
Code:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 10, char 1
[b]gen_id[b]
Lt. F1 soll aber der Syntax bekannt sein, um einen Generator zu setzen. Somit bin ich leider genauso weit wie bisher.

Noch was anderes, warum sollte man den Generator nicht zurücksetzen. Diese Tabelle beinhaltet immer nur die Datensätze für eine Veranstaltung. Ist die Veranstaltung abgeschlossen, werden diese wieder gelöscht. Bei der nächsten Veranstaltung werden sie wieder neu generiert.

Jürgen Thomas 18. Jan 2010 11:43

Re: Generator zurücksetzen aus StoredProcedure
 
Hallo,

in der Firebird-Doku 2.0 steht:
Zitat:

Certain constructs, including all DDL (Data Definition Language) statements, are omitted.
Dies gilt also erst recht für das "uralte" Interbase 5, und SET GENERATOR und Varianten gehören eben zu DDL.

Du kannst es also nur manuell erledigen, aber nicht aus einer SP heraus.

Gruß Jürgen

DirkG 18. Jan 2010 11:53

Re: Generator zurücksetzen aus StoredProcedure
 
OK. :gruebel:
Trotzdem ein kleines Aufbäumen; In der Online Hilfe der IB Console zu SQL steht:
Zitat:

Produces a system-generated integer value. Available in SQL, DSQL, and isql.
Ich war bisher davon ausgegangen, isql wird in Stored Procedure verwendet.
Da muss ich mir wohl doch was anderes überlegen... :wall:

TBx 18. Jan 2010 12:11

Re: Generator zurücksetzen aus StoredProcedure
 
Sorry, ich hatte vergessen, dass Funktionen auch einer Variablen zugewiesen werden müssen.
So sollte es nun funktionieren:

SQL-Code:
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */
ALTER PROCEDURE RESETRUNS
(
  EVENTID INTEGER
)
AS
 DECLARE VARIABLE NewGen INT;
 DECLARE VARIABLE NEWID INTEGER;
BEGIN
  DELETE FROM RUNS WHERE (RUN_EVENT =:EVENTID);

  SELECT MAX(RUN_ID)+1 FROM RUNS INTO :NewGen ;
 
  /* SET GENERATOR GEN_RUN TO :NewGen; */
  NEWID = GEN_ID (GEN_RUNS, -(GEN_ID (GEN_RUNS, 0) - :NewGen));
  ;
 
END
 ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;

DirkG 18. Jan 2010 12:29

Re: Generator zurücksetzen aus StoredProcedure
 
@TBx

:wall: Danke da hätte ich auch selber drauf kommen können! Manchmal ist man so verbohrt in eine Lösung, das man den Wald nicht vor lauter Bäumen sieht.

Noch mal zurück zu deiner Aussage, das du das so nicht machen würdest. Kannst du mir kurz erklären warum?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 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