Bonjour,

Je dois modifier la structure de différentes bases de données existantes pour ajouter une colonne gérer un nouveau n° de séquence que sera utilisé par l'application.

j'utilise un fichier texte qui contient le script de mise à jour à exécuter.

Le fichier contient le script suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SET SQL DIALECT 3;
 
SET NAMES NONE;
 
CREATE SEQUENCE NUMEROTATIONDOC;
 
-- initialisation du compteur
SET TERM ^ ; 
EXECUTE BLOCK 
AS 
DECLARE LASTVALUE INTEGER; 
BEGIN 
  SELECT max(numcontrat)+1 FROM contrat INTO :LASTVALUE; 
  EXECUTE STATEMENT 'ALTER SEQUENCE NUMEROTATIONDOC RESTART WITH ' || :LASTVALUE || ';'; 
END^ 
SET TERM ; ^ 
COMMIT;
 
-- recalcul des stats des index
SET TERM ^ ; 
EXECUTE BLOCK 
AS 
DECLARE INDEX_NAME VARCHAR(31); 
BEGIN 
FOR SELECT RDB$INDEX_NAME FROM RDB$INDICES INTO :INDEX_NAME DO 
  EXECUTE STATEMENT 'SET STATISTICS INDEX ' || :INDEX_NAME || ';'; 
END^ 
SET TERM ; ^ 
COMMIT;
Quand j'utilise l'éxécuteur de script d'IBExpert pour charger le script, il n'y a aucune erreur.

Comme il y a pas mal de base a modifier, j'ai fait un exe qui charge un script sql et le lance sur les bases à mettre à jour.
l'application delphi est faite en win32 avec BDS2006 .
J'utilise le composant IBScript de la palette Interbase. en le chargeant avec ce fichier script.

Il y a d'autres fichiers script de lancés séquentiellement mais c'est celui-là qui me pose problème.
Quand il passe sur ce fichier, le composant ne renvoi aucune erreur mais rien n'est éxécuté et plus aucun script après celui-ci ne fonctionne.

J'ai isolé les parties du script pour ne garder que :

EXECUTE BLOCK
AS
DECLARE LASTVALUE INTEGER;
BEGIN
SELECT max(numcontrat)+1 FROM contrat INTO :LASTVALUE;
EXECUTE STATEMENT 'ALTER SEQUENCE NUMEROTATIONDOC RESTART WITH ' || :LASTVALUE || ';';
END^
Le code pour le lancer est :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
    IBScript1.Terminator := '^' ;        
    IBScript1.Script.LoadFromFile(  chFile);
    IBScript1.ExecuteScript;
(j'ai d'abord tester en conservant les instructions set term du script et en laissant ';' dans Terminator. Il n'y a pas de différence.)
J'ai l'erreur:
Dynamic SQL error
SQL error code =-104
Token unknown - line 5 ,column 46
?


Qui correspond visiblement au ":" devant LASTVALUE

sur le morceau
EXECUTE BLOCK
AS
DECLARE INDEX_NAME VARCHAR(31);
BEGIN
FOR SELECT RDB$INDEX_NAME FROM RDB$INDICES INTO :INDEX_NAME DO
EXECUTE STATEMENT 'SET STATISTICS INDEX ' || :INDEX_NAME || ';';
END^
J'ai la même erreur sur la position qui correspond au ":" devant INDEX_NAME

Il y a visiblement quelque-chose qui m'échappe sur l’exécution des scripts qui contiennent des variables.

Pour tester, il suffit d'une base avec une table contrat, et un champ numcontrat de type integer.

Le script créé une sequence et lui attribue le dernier n° +1 utilisé dans la table contrat.


Si vous avez des pistes, je suis preneur.
Merci