Aller directement à la fin des métadonnées
Aller au début des métadonnées

Vous regardez une version antérieure (v. /wiki/spaces/PAI/pages/10558406750/Ex+cution+de+scripts) de cette page.

afficher les différences View Version History

Vous regardez la version actuelle de cette page. (v. 1) afficher la version suivante »

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).
La syntaxe du fichier contenant le script dépend du moteur de base de données :

  1. 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 ).

  2. Oracle. Pour Oracle, c'est PL/SQL qu'il faut utiliser (http://www.oracle.com/technology/tech/pl_sql/index.html ).

  3. 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>

  • Aucune étiquette