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

PostgreSQL Discussion :

plpgsql faire un trigger


Sujet :

PostgreSQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut plpgsql faire un trigger
    Bonjour,

    Je commence avec postgresql.
    J'ai fais une base avec des tables commandes et produits et une table de liaison.

    Je voudrais faire un trigger qui lors d'un delete sur la table produit verifie s'il y a une commande en cours pour ce produit
    si oui on annule le delete sinon on fait bien le delete.

    tres simple pour apprendre, je sais que je ferais cela avec une clef etrangere bien sur
    merci beaucoup

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Voici la fonction que j'ai faite et es question que je me pose :

    DECLARE

    BEGIN
    SELECT cp_co_id FROM commandes_produits WHERE cp_p_id=1;
    RETURN OLD;
    IF NOT FOUND THEN
    DELETE FROM commandes WHERE co_id=cp_co_id;
    END IF;
    END;

    - deja avec ceci j'ai un message d'erreur : 'select query has no destination for result' -> que faire ?
    - j'ai besoin que le select renvoi l'id de la commande s'il existe (cp_co_id)
    - ensuite il faut que je remplace cp_p_id=1 par cp_p_id = id du produit en cours (sur lequel est appliqué le trigger) je ne sais pas comment.

    merci beaucoup

  3. #3
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Salut !

    Citation Envoyé par etien
    - deja avec ceci j'ai un message d'erreur : 'select query has no destination for result' -> que faire ?
    Dans ton bloc DECLARE, tu dois déclarer une variable qui contiendra la valeur du SELECT. Dans ce SELECT, il te faut une clause INTO pour indiquer la variable qui contiendra le résultat.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE
        varID integer;
    BEGIN
       SELECT cp_co_id INTO varID FROM commandes_produits WHERE cp_p_id=...;

    Citation Envoyé par etien
    - j'ai besoin que le select renvoi l'id de la commande s'il existe (cp_co_id)
    Avec ce que j'ai écrit plus haut, il sera dans la variable.
    Pas de RETURN dans les procédures ;-) C'est uniquement pour les fonctions.

    Citation Envoyé par etien
    - ensuite il faut que je remplace cp_p_id=1 par cp_p_id = id du produit en cours (sur lequel est appliqué le trigger) je ne sais pas comment.
    Tu peux récupérer la valeur en écrivant NEW.cp_p_id.

    N'oublie pas de regarder dans la doc officielle si tu débutes en PL/pgSQL : http://www.postgresql.org/docs/8.1/i...ogramming.html

    Bonne continuation

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci Beaucoup pour toutes ces explications

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    J'avance j'avance

    Alors mon select peut me renvoyer plusieurs resultats je fais donc

    DECLARE
    myrec record;

    BEGIN

    FOR myrec IN SELECT cp_co_id INTO produit_verif FROM commandes_produits WHERE cp_p_id=$1 LOOP

    IF NOT FOUND THEN
    DELETE FROM commandes WHERE co_id = (SELECT cp_co_id FROM produit_verif);

    ELSE RETURN NULL;
    END IF;
    END LOOP;
    END;

    Et j'ai le message d'erreur : Cannot open SELECT INto query as Cursor

    merci d'avance

  6. #6
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    à tester, mais le INTO produit_verif ne sert à rien dans la requête SELECT sur laquelle tu boucles, puisque les données sont contenues dans myrec...

Discussions similaires

  1. Comment faire un trigger after update multiple
    Par java250r dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/08/2012, 17h20
  2. faire un trigger on select
    Par nicolas_lepot dans le forum Développement
    Réponses: 10
    Dernier message: 05/01/2012, 15h57
  3. faire un trigger
    Par jojo1000 dans le forum Langage
    Réponses: 8
    Dernier message: 04/01/2010, 14h05
  4. Comment faire un trigger
    Par momoh dans le forum Signal
    Réponses: 1
    Dernier message: 04/12/2007, 22h28
  5. Réponses: 5
    Dernier message: 15/06/2007, 16h05

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