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 :
Quand j'utilise l'éxécuteur de script d'IBExpert pour charger le script, il n'y a aucune erreur.
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;
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 :
Le code pour le lancer est :EXECUTE BLOCK
AS
DECLARE LASTVALUE INTEGER;
BEGIN
SELECT max(numcontrat)+1 FROM contrat INTO :LASTVALUE;
EXECUTE STATEMENT 'ALTER SEQUENCE NUMEROTATIONDOC RESTART WITH ' || :LASTVALUE || ';';
END^
(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.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IBScript1.Terminator := '^' ; IBScript1.Script.LoadFromFile( chFile); IBScript1.ExecuteScript;
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
J'ai la même erreur sur la position qui correspond au ":" devant INDEX_NAMEEXECUTE 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^
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
Partager