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
    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
    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/plpgsql-errors-and-messages.html

    Bisous bisous

  3. #3
    Membre régulier
    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
    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
    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

    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.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Membre régulier
    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.

###raw>template_hook.ano_emploi###