PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 24/05/2018 08:19:36

Mael
Membre

Migration Oracle => PostgreSQL (savepoint)

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

#2 25/05/2018 11:44:08

gleu
Administrateur

Re : Migration Oracle => PostgreSQL (savepoint)

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.

Hors ligne

#3 25/05/2018 14:17:26

Mael
Membre

Re : Migration Oracle => PostgreSQL (savepoint)

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

Pied de page des forums