IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Fonctions imbriquées et transaction [9.2]


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Fonctions imbriquées et transaction
    Bonjour à tous,

    J'ai deux fonctions, chacune effectuant des insertions, dans la fonction1 j'insère un élément dont je récupère l'identifiant puis j'appel la fonction2 en lui passant l'identifiant créé dans la fonction1.

    Mon soucis est que l'identifiant n'est pas connu dans fonction2, car la transaction n'est pas validée.

    Existe-t-il une solution à ce problème comme par exemple annuler l'effet de la transaction de la fonction2 si celle-ci est contenu dans une autre, ici fonction1 ?

    Par avance merci pour les réponses que vous voudrez bien m'apporter.

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Tu peux peut-être remplacer la fonction2 par un trigger sur insertion. Le plus simple serait de traiter le tout par une seule fonction.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Mon soucis est que l'identifiant n'est pas connu dans fonction2, car la transaction n'est pas validée.
    Tout ce qui est fait dans une transaction est visible dans cette transaction.
    Peu importe qu'on soit dans la fonction1 ou 2 et qu'elles soient imbriquées ou pas.

    En fait, les problèmes de visibilité peuvent se poser entre deux connections distinctes, ça n'a rien à voir avec les fonctions.

  4. #4
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    estofilo, Merci de l'info. Je viens de faire un petit essai il ressort que la fonction appelée se compote comme une transaction imbriquée.
    La première fonction...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    create function essaiimbrication1(e boolean)returns int
    as
    $$
    declare ident int; r int;
    begin
    delete from t;
    insert into t(nom) values('bidon');
    select id into ident from t where nom='bidon';
    select count(nomp)::int into r from essaiimbrication2(ident);
    if e=true then
    insert into t(nom) values('bidonferme'); --insertion incorrecte taille>7
    else 
    insert into t(nom) values('sacvide');
    end if;
    return r;
    end
    $$ language 'plpgsql'
    la deuxième...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create function essaiimbrication2(id int)returns table (idp int, nomp varchar(7))
    as
    $$
    begin
    update t set nom=nom || 's'; --tentative de mise à jour
    return query(select * from t where t.id=$1);
     
    end
    $$ language 'plpgsql'
    La table cobaye...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE t
    (id serial PRIMARY KEY,  nom character varying(7))
    l'appelle sans erreur de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select essaiimbrication1(FALSE) as r
    appelle avec erreur (le tout est annulé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select essaiimbrication1(TRUE) as r
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Mon bonjour Cotonien....

    Hélas PostGreSQL ne permet pas de contrôler les transactions dans les routines contrairement à Oracle ou SQL Server.

    La seule solution est donc de tout faire dans une même fonction. L'erreur annulant la transaction globalement.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Bonjour SQLpro
    Cotonien....

    Citation Envoyé par SQLpro Voir le message
    Hélas PostGreSQL ne permet pas de contrôler les transactions dans les routines contrairement à Oracle ou SQL Server.
    ...
    Je dirais plutôt...
    PostGreSQL ne permet pas de contrôler EXPLICITEMENT les transactions dans les routines contrairement à Oracle ou SQL Server.
    L'essai ci-dessus prouve que la fonction interne se comporte comme une transaction imbriquée et la fonction appelante peut annuler globalement la transaction.
    La transaction est donc implicite est totalement ACID.
    Grand à vous pour l'attention particulière portée à PostgreSQL .
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci pour vos réponses !

    L'erreur venait de mon code, grâce à vous j'ai pu corriger.

    Je vous remercie également pour vos compléments d'information qui mon permis de mieux appréhender le fonctionnement de Postgresql.

    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer une fonction imbriquée
    Par Mikiman dans le forum Langage
    Réponses: 6
    Dernier message: 14/08/2006, 15h37
  2. Comportement fonctions imbriquées avec appel à Xmlhttprequest
    Par eirmag dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 04/05/2006, 16h10
  3. Fonctions imbriquées
    Par programaniac dans le forum Langage
    Réponses: 1
    Dernier message: 19/11/2005, 19h49
  4. Fonctions imbriquées - références
    Par Yux dans le forum Langage
    Réponses: 12
    Dernier message: 04/10/2005, 11h01
  5. Réponses: 5
    Dernier message: 24/08/2005, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo