Les transactions sont synchronisées par le moniteur transactionnel d'Up ! Object Management System.
Le fichier source est ${UPS_HOME}/upsqry/demo/${UPS_LANGUAGE}/xadtc.upl.
Cet exemple utilise les instructions de l'extension d'Up ! 5GL pour Up ! Query. Les objets sémantiques sont déclarés statiquement.
Pour analyser le fichier source, UpsQry.upi doit être déclaré parmi les modules importés dans le fichier ${UPS_HOME}/ini/${UPS_USER}/upsp5l.ini.
Pour exécuter, les scripts :
Il faut également ne pas oublier de démarrer le service Distributed Transaction Coordinator sur Windows.
upscmp Source=xadtc.upl
xadtc ConnexionDb2=scott/tiger ConnexionMySql=scott/tiger@localhost/MySql ConnexionOracle=scott/tiger ConnexionPostgreSQL=scott/tiger@localhost/scott ConnexionSqlServer=scott/tiger@SQLEXPRESS/scott
upssng Source=xadtc.upl ConnexionDb2=scott/tiger ConnexionMySql=scott/tiger@localhost/MySql ConnexionOracle=scott/tiger ConnexionPostgreSQL=scott/tiger@localhost/scott ConnexionSqlServer=scott/tiger@SQLEXPRESS/scott
Source Composant "Exemple d'emploi de Xa et Ms DTC" Version 4.0.0;
ImporterModule
/************/
UpsDb2(<UpsDb2.upi>, ImporterDefinitions);
UpsMys(<UpsMys.upi>, ImporterDefinitions);
UpsOra(<UpsOra.upi>, ImporterDefinitions);
UpsPgs(<UpsPgs.upi>, ImporterDefinitions);
UpsMss(<UpsMss.upi>, ImporterDefinitions);
ConnexionSql
/**********/
MaConnexionDb2(Db2, "scott/tiger", SynchroniserTransactions);
MaConnexionMySql(MySql, "scott/tiger", SynchroniserTransactions);
MaConnexionOracle(Oracle, "scott/tiger", SynchroniserTransactions);
MaConnexionPostgreSQL(PostgreSQL, "scott/tiger", SynchroniserTransactions);
MaConnexionSqlServer(MicrosoftSqlServer, "scott/tiger", SynchroniserTransactions);
Procedure SupprimerEmployes(MaConnexionSql : Nul Ou IConnexionSql)
/****************************************************************/
Debut
OrdreSql MonOrdreSql ConnexionSql MaConnexionSql
SqlStatique
DELETE FROM scott.emp
WHERE deptno=40;
MaConnexionSql.Valider();
Fin Procedure
Procedure AjouterEmployes(MaConnexionSql : Nul Ou IConnexionSql, NomEmploye : Nul Ou Caractere, DateEmbauche : Nul Ou Date,
NumeroEmploye : Nul Ou Entier, Salaire : Nul Ou Reel)
/*************************************************************************************************************************/
Debut
OrdreSql MonOrdreSql ConnexionSql MaConnexionSql
ParametreSql(NomEmploye, DateEmbauche, NumeroEmploye, Salaire)
SqlStatique
INSERT INTO scott.emp(ename, hiredate, empno, deptno, sal)
VALUES (${NomEmploye}, ${DateEmbauche}, ${NumeroEmploye}, 40, ${Salaire});
Fin Procedure
Procedure ListerEmployes(MaConnexionSql : Nul Ou IConnexionSql)
/*************************************************************/
Debut
Ecran.Ecrire("Connexion "+Decoder(MaConnexionSql.FormatDeLaBaseDeDonnees,
FormatBaseDeDonneesDb2, "Db2", FormatBaseDeDonneesMaxDB, "Max DB", FormatBaseDeDonneesMySql, "My Sql",
FormatBaseDeDonneesOdbc, "Odbc", FormatBaseDeDonneesSqlServer, "SqlServer", FormatBaseDeDonneesPostgreSQL, "PostgreSQL",
FormatBaseDeDonneesSqlServer, "Sql Server"));
Ecran.Ecrire("==================================");
RequeteSql MaRequeteSql2 ConnexionSql MaConnexionSql
ResultatSql(NomEmploye : Nul Ou Caractere TailleMaxSql 20, DateEmbauche : Nul Ou Date, NumeroEmploye : Nul Ou Entier, Salaire : Nul Ou Reel)
SqlStatique
SELECT ename:=${NomEmploye}, hiredate:=${DateEmbauche}, empno:=${NumeroEmploye}, sal:=${Salaire}
FROM scott.emp
WHERE deptno=40;
Ecran.Ecrire(NomEmploye+" "+Caractere(DateEmbauche)+" "+Caractere(NumeroEmploye)+" "+Caractere(Salaire));
Fin RequeteSql
Fin Procedure
Principal
/*******/
Debut
/* Suppression des employes. */
SupprimerEmployes(IConnexionSql(MaConnexionDb2));
SupprimerEmployes(IConnexionSql(MaConnexionMySql));
SupprimerEmployes(IConnexionSql(MaConnexionOracle));
SupprimerEmployes(IConnexionSql(MaConnexionPostgreSQL));
SupprimerEmployes(IConnexionSql(MaConnexionSqlServer));
/* Modifications annulees. */
AjouterEmployes(IConnexionSql(MaConnexionDb2), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionMySql), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionOracle), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionPostgreSQL), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionSqlServer), "youpi4", DateSysteme(), 9101, 1101.00);
TachePrincipale.TransactionCourante.Invalider();
ListerEmployes(IConnexionSql(MaConnexionDb2));
ListerEmployes(IConnexionSql(MaConnexionMySql));
ListerEmployes(IConnexionSql(MaConnexionOracle));
ListerEmployes(IConnexionSql(MaConnexionPostgreSQL));
ListerEmployes(IConnexionSql(MaConnexionSqlServer));
Ecran.Ecrire(");
/* Modifications validees. */
AjouterEmployes(IConnexionSql(MaConnexionDb2), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionMySql), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionOracle), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionPostgreSQL), "youpi4", DateSysteme(), 9101, 1101.00);
AjouterEmployes(IConnexionSql(MaConnexionSqlServer), "youpi4", DateSysteme(), 9101, 1101.00);
TachePrincipale.TransactionCourante.Valider();
ListerEmployes(IConnexionSql(MaConnexionDb2));
ListerEmployes(IConnexionSql(MaConnexionMySql));
ListerEmployes(IConnexionSql(MaConnexionOracle));
ListerEmployes(IConnexionSql(MaConnexionPostgreSQL));
ListerEmployes(IConnexionSql(MaConnexionSqlServer));
Ecran.Ecrire(");
/* Suppression des employes. */
SupprimerEmployes(IConnexionSql(MaConnexionDb2));
SupprimerEmployes(IConnexionSql(MaConnexionMySql));
SupprimerEmployes(IConnexionSql(MaConnexionOracle));
SupprimerEmployes(IConnexionSql(MaConnexionPostgreSQL));
SupprimerEmployes(IConnexionSql(MaConnexionSqlServer));
Fin Principal