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 :

Requête INSERT non blocante ?


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut Requête INSERT non blocante ?
    Bonjour,

    J'ai une fonction avec dedans une requête INSERT. Il peut arriver que certaines valeurs soient à NULL, ce qui fait planter la requête (violation de contrainte non-null)
    Ma question est donc : est-il possible de faire en sorte que ma fonction retourne une valeur précise en cas de plantage de l'INSERT ? et non l'erreur classique indiquant le problème.

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Bonjour bonjour

    Un petit passage sur la doc du mot clef RAISE devrait pouvoir répondre à votre besoin :
    https://www.postgresql.org/docs/9.3/...-messages.html

    Bisous bisous

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    Pour RAISE j'ai regardé la doc. D'après ce que je vois :
    - RAISE seul se contente d'afficher une infos : pas suffisant pour moi.
    - RAISE EXCEPTION stop la transaction : ce que je ne souhaite pas

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Je n'ai peut-être pas compris le message initial du coup, je pensais que le RAISE suffirait.

    Pourriez-vous détailler pourquoi il n'est pas suffisant ?
    Quel process exact vous voulez lors d'un insert de null ?

    Par contre, si vous voulez que l'insertion, même en plantant, fasse continuer le script, je ne pense pas que l'atomicité de la transaction soit présente..

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    Par exemple j'ai la fonction ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE FUNCTION commande.ajouter_ligne(p_id_commande INTEGER, p_quantite INTEGER) RETURNS BOOL AS $$
    BEGIN
        INSERT INTO commande.ligne (id_commande, quantite) VALUES (p_id_commande, p_quantite);
     
        RETURN TRUE;
    END;
    $$ LANGUAGE plpgsql;
    J'ai simplifié au maximum le code.
    Le champ quantite de la table commande.ligne doit obligatoirement être > 0
    Ce que je cherche à savoir, si c'est faisable biensur, c'est si il est possible que ma fonction me retourne FALSE si je rentre en second paramètre 0 (ce qui fera planter la requête d'insertion) et TRUE si j'entre 1.

    Biensur dans ce cas il est plus simple de vérrifier p_quantite avant la requête et c'est la méthode que j'utilise actuellement.
    Si je cherche à savoir si cela est possible c'est simplement pour éviter d'avoir à faire un certain nombre de vérrifications sur les champs se trouvant dans la requête d'insertion.

    Possible que ce que je souhaite savoir ne soit pas du tout une bonne méthode

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 780
    Points
    30 780
    Par défaut
    C'est dans la définition de la table commande.ligne qu'il faut ajouter une contrainte CHECK quantite > 0.

    Plus il y a de contraintes posées directement sur le modèle de données, moins il y aura de risque d'insérer des valeurs invalides.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    Oui je connais cela al1_24, c'est déjà ce que j'utilise. DOnc sinon pour répondre à ma question j'imagine que ce n'est pas possible ou pas la bonne méthode (je m'en doutais un peu...) Je reste donc avec ma solution initiale qui est de vérrifer les données avant l'insertion.

Discussions similaires

  1. [2008R2] Trigger non exécuté lors d'une requête INSERT
    Par Invité dans le forum Développement
    Réponses: 2
    Dernier message: 05/01/2017, 17h50
  2. requête insert
    Par mattoo dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/04/2005, 14h09
  3. Réponses: 4
    Dernier message: 05/04/2005, 18h28
  4. probleme requête insert.... where
    Par Amandine62 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/02/2005, 14h26
  5. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45

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