Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/06/2006, 09h19   #1
Invité de passage
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 0
Points : 0
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
etien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 12h12   #2
Invité de passage
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 0
Points : 0
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
etien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 18h51   #3
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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 :
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
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 10h54   #4
Invité de passage
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 0
Points : 0
Merci Beaucoup pour toutes ces explications
etien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 11h47   #5
Invité de passage
 
Inscription : juin 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 7
Points : 0
Points : 0
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
etien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 16h45   #6
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
à 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...
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h05.


 
 
 
 
Partenaires

Hébergement Web