Exécution de scripts
Exécution de scripts
Description
Une autre fonctionnalité de l'utilitaire xpsqlsynchro.dhop est la possibilité d'exécuter des scripts SQL de migration ou de mise à jour.
L'utilitaire est accessible depuis le menu « Synchronisation », choix « Exécuter un script ».
L'exécution de scripts peut également être appelée en-dehors de l'utilitaire xpsql.dhop : il faut simplement appeler le programme « xpsqlsynchro.dhop » et lui envoyer par "ping" les paramètres suivants :
« TypeAction » : indique le type d'action à effectuer. Deux valeurs sont possibles : « SYNCHRO » et « SCRIPT ». Pour l'exécution d'un script, il faut utiliser « SCRIPT ».
« CheminDico » : chemin où se trouvent les dictionnaires actuels, typiquement /divalto/« nom de base sql ».
« CheminFichierScript » : chemin complet du script SQL à exécuter.
« SupprimerTableSauvegarde » : permet de supprimer ou non les tables de sauvegarde des champs supprimés suite à une synchronisation (tables suffixées par « _oldColumns »). Pour les supprimer, doit valoir 1.
« NomServeur » : Nom du serveur où se situe la base de données.
« NomBase » : Nom de la base de données à synchroniser.
« RequiertValidation » : Demande à l'utilisateur de valider la fenêtre de compte-rendu (0 ou 1). Si 0, les erreurs d'exécution sont affichés via MessageBox.
Syntaxe du fichier
Le fichier passé DOIT commencer par « <execute> ».
A la fin du fichier, on trouve « <executeDropOldColumns> ».
Les instructions qui suivent permettent de supprimer les tables suffixées par « _oldcolumns »
Ces tables sont issues d'une synchronisation réussie avec des suppressions de champs. Elles ne sont exécutées quei si le paramètre « SupprimerTableSauvegarde » vaut 1 ou si la case « Supprimer les tables de sauvegarde des champs supprimés » est cochée (Cf. rubrique Description de la synchronisation du schéma de la base).
Consultez le tableau des versions maintenues dans l’espace produit pour vérifier la compatibilité de la version Harmony et la compatibilité de la base cible MS SQL Server, IBM DB2
La syntaxe du fichier contenant le script dépend du moteur de base de données :
Microsoft SQL Server La première instruction, « USE <BASESQL> ; » est obligatoire et doit rester inchangée. « <BASESQL> » sera automatiquement remplacé par le nom de la base. Le reste est du Transact-SQL standard (http://msdn.microsoft.com/fr-fr/library/ms189826%28v=SQL.90%29.aspx ).
IBM DB2. Pour ce moteur de base de données, toutes les requêtes doivent se trouver dans des procédures. De plus, la balise « <execute> » est obligatoire après chaque création, exécution et suppression de procédure. Attention : la procédure DOIT porter le nom « proc_migration ». Pour le reste, la syntaxe reste assez proche de celle du PL/SQL d'Oracle (http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/sqlp/rbafykickoff.htm ).
Exemple de script SQL Microsoft
<execute>
USE <BASESQL> ;
/* Requête simple pour récupérer la valeur d'un ancien champ */
/* substring sert à tronquer la valeur car le nouveau champ est plus court que l'ancien */
update dbo.soc set chemincod = (select substring(o.winchn, 0, 20) from dbo.soc_oldcolumns o where o.soc_id = dbo.soc.soc_id);
/* Requête avec un test utilisant un curseur */
/* Déclaration des variables et des curseurs */
DECLARE @mres_id int;
DECLARE @n_ce4 char(1);
DECLARE @resqte numeric(12,3);
DECLARE c_mres CURSOR FOR
select mres_id, resqte from dbo.mres order by mres_id;
/* Mise à jour avec parcours d'un curseur */
open c_mres;
fetch next from c_mres into @mres_id, @resqte;
while @@fetch_status = 0
begin
/* positionne ce4 en fonction de resqte */
if @resqte != 0
set @n_ce4 = 1;
else
set @n_ce4 = 0;
update dbo.mres set ce4 = @n_ce4 where mres_id = @mres_id;
fetch next from c_mres into @mres_id, @resqte;
end
/* Suppression des tables suffixées par "_oldcolumns" */
<executeDropOldColumns>
DECLARE @table_name sysname;
DECLARE cur_table CURSOR FOR
SELECT name FROM sysobjects WHERE type='U' and lower(name) like '%_oldcolumns';
open cur_table;
fetch next from cur_table
into @table_name;
while @@fetch_status = 0
begin
exec('DROP TABLE dbo.' + @table_name);
fetch next from cur_table
into @table_name;
end
close cur_table;
deallocate cur_table;
Exemple de script ORACLE
<execute>
/* Déclaration des variables et des curseurs */
DECLARE
n_ce4 char(1);
mres_id int;
resqte int;
CURSOR c_mres IS select mres_id, resqte from <BASESQL>.mres ORDER BY mres_id;
BEGIN
/* Requête simple pour récupérer la valeur d'un ancien champ */
/* substr sert à tronquer la valeur car le nouveau champ est plus court que l'ancien */
/* pour le substr d'oracle, le <start_position> (2ème paramètre) commence à 1 */
UPDATE <BASESQL>.soc SET chemincod = (SELECT substr(o.winchn, 1, 20) FROM <BASESQL>.soc_oldcolumns o WHERE o.soc_id = <BASESQL>.soc.soc_id);
COMMIT;
/* Requête avec un test utilisant un curseur */
OPEN c_mres;
LOOP
FETCH c_mres INTO mres_id, resqte;
EXIT WHEN c_mres%NOTFOUND;
/* positionne ce4 en fonction de resqte */
IF resqte != 0 THEN
n_ce4 := 1;
ELSE
n_ce4 := 0;
END IF;
EXECUTE IMMEDIATE('update <BASESQL>.mres set ce4 = ' || n_ce4 || ' where mres_id = ' || mres_id);
END LOOP;
COMMIT;
CLOSE c_mres;
/* Suppression des tables suffixées par "_oldcolumns" */
<executeDropOldColumns>
DECLARE
table_name user_tables.table_name%TYPE;
CURSOR cur_table IS SELECT table_name FROM user_tables where lower(table_name) like '%_oldcolumns';
BEGIN
OPEN cur_table;
LOOP
FETCH cur_table INTO table_name;
EXIT WHEN cur_table%NOTFOUND;
EXECUTE IMMEDIATE('DROP TABLE <BASESQL>.' || table_name);
END LOOP;
COMMIT;
CLOSE cur_table;
END;
Exemple de script IBM DB2
<execute>
/* Requête simple pour récupérer la valeur d'un ancien champ */
/* substring sert à tronquer la valeur car le nouveau champ est plus court que l'ancien */
/* Création de la procédure */
CREATE PROCEDURE <BASESQL>.proc_migration
LANGUAGE SQL
BEGIN
UPDATE <BASESQL>.soc SET chemincod = (SELECT substring(o.winchn, 0, 20) FROM <BASESQL>.soc_oldcolumns o WHERE o.soc_id = <BASESQL>.soc.soc_id);
end
<execute>
/* Lancement de la procédure */
call <BASESQL>.proc_migration()
<execute>
/* Suppression de la procédure */
drop procedure <BASESQL>.proc_migration
<execute>
/* Création de la procédure avec parcours de curseur */
/* Requête avec un test */
CREATE PROCEDURE <BASESQL>.proc_migration
LANGUAGE SQL
BEGIN
declare mres_id integer;
declare resqte numeric(12,3);
declare n_ce4 char(1);
declare req_sql varchar(150); /* adapter la taille de la variable en fonction de la requête */
declare sqlcode integer default 0;
DECLARE c_mres CURSOR FOR
select mres_id, resqte from <BASESQL>.mres order by mres_id;
open c_mres;
fetch from c_mres into mres_id, resqte;
while (SQLCODE=0) DO
/* positionne ce4 en fonction de resqte */
if resqte != 0 then
set n_ce4 = 1;
else
set n_ce4 = 0;
end if;
set req_sql = 'update <BASESQL>.mres set ce4 = ' || n_ce4 || ' where mres_id = ' || mres_id;
EXECUTE IMMEDIATE req_sql;
fetch from c_mres
into mres_id, resqte;
end while;
close c_mres;
end
<execute>
call <BASESQL>.proc_migration()
<execute>
drop procedure <BASESQL>.proc_migration
<execute>
/* Suppression des tables suffixées par "_oldcolumns" */
<executeDropOldColumns>
CREATE PROCEDURE <BASESQL>.proc_migration
LANGUAGE SQL
BEGIN
DECLARE table_name varchar(128);
DECLARE sqlcode INTEGER DEFAULT 0;
DECLARE req_sql varchar(150);
DECLARE cur_table CURSOR FOR SELECT table_name FROM qsys2.systables where lower(table_name) like '%_oldcolumns' and lower(table_owner) = lower('<BASESQL>');
open cur_table;
fetch from cur_table into table_name;
WHILE (SQLCODE=0) DO
set req_sql = 'drop table <BASESQL>.' || table_name;
EXECUTE IMMEDIATE req_sql;
FETCH cur_table into table_name;
END WHILE;
close cur_table;
END
<execute>
call <BASESQL>.proc_migration()
<execute>
drop procedure <BASESQL>.proc_migration
<execute>