Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je cherche à migrer du code pl/sql vers du pl/pgsql et je rencontre quelques problèmes notamment pour ce qui est de migrer des procédures qui comportent des savepoints.
Voici un exemple simple sous oracle illustrant mon problème :
CREATE TABLE exemple ( id INTEGER, string VARCHAR2(50), date_creation TIMESTAMP);
CREATE OR REPLACE PROCEDURE p1 AS
BEGIN
p4();
INSERT INTO exemple VALUES (1, 'Procédure 1', current_timestamp);
SAVEPOINT sp1_1;
INSERT INTO exemple VALUES (2, 'Procédure 1', current_timestamp);
ROLLBACK TO SAVEPOINT sp1_1;
p3();
END;
/CREATE OR REPLACE PROCEDURE p2 AS
BEGIN
INSERT INTO exemple VALUES (1, 'Procédure 2', current_timestamp);
COMMIT;
INSERT INTO exemple VALUES (2, 'Procédure 2', current_timestamp);
SAVEPOINT sp1_1;
p3();
END;
/CREATE OR REPLACE PROCEDURE p3 AS
BEGIN
INSERT INTO exemple VALUES (1, 'Procédure 3', current_timestamp);
ROLLBACK TO sp1_1;
COMMIT;
END;
/CREATE OR REPLACE PROCEDURE p4 AS
BEGIN
INSERT INTO exemple VALUES (1, 'Procédure 4', current_timestamp);
SAVEPOINT sp4_1;
INSERT INTO exemple VALUES (2, 'Procédure 4', current_timestamp);
END;
/
Bien sûr, les rollback to de cet exemple ne sont pas arbitraire, il y a des tests de conditions qui déterminent s’il y a un rollback, un rollback to ou rien du tout.
J’ai commencé à élaborer une solution grâce à la gestion d’exceptions mais je me retrouve bloqué lorsque je suis dans la configuration ci-dessus avec le dernier rollback to sp1_1 dans P3.
De plus lorsque j’utilise les exceptions pour me permettre d’annuler certaines modifications, je suis obligé de regrouper les procédures P4, P1, P3 et les procédures P2 et P3 (ce qui me fait dupliquer le code de P3).
Mes questions sont donc :
- Est-ce qu’il y a un moyen de migrer ce code sous PostgreSQL 10 pour qu’il corresponde au code Oracle (savepoint) ?
- Si oui, comment le migrer et est-il possible de le faire sans dupliquer le code de P3 ?
Merci d’avance de votre aide.
Hors ligne
Ces exemples n'ont pas de sens au niveau de PostgreSQL.. Par exemple, un ROLLBACK vers un savepoint d'une autre fonction est totalement impossible. Un COMMIT seul est impossible. Etc. Mais si je comprends bien, il ne s'agit pas des fonctions complètes, dès lors il est difficile de se prononcer sur leur migration possible à PL/pgsql.
Guillaume.
Hors ligne
Merci pour ta réponse.
Je comprends que ce n’est pas possible de migrer ce code tel quel sous PostgreSQL, mais je cherche à me rapprocher au plus du fonctionnement d’oracle.
J’ai fini par abandonner l’idée de faire un COMMIT dans une procédure (vivement la version 11 de PostgreSQL), en revanche j’arrive à reproduire le système de savepoint d’oracle grâce à plusieurs bloc BEGIN imbriqués et grâce aux exceptions. Cependant mon approche à des limites, comme le fait de dupliquer le code de certaines procédures mais aussi le fait que je suis restreint pour annuler une partie de la procédure (je suis obligé de tester mes conditions dans le bloc BEGIN concerné).
Je voulais donc savoir si quelqu’un avait déjà eu ce problème et s’il a pu le résoudre.
Hors ligne
Pages : 1