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

Langage SQL Discussion :

Problème dans ma fonction


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Points : 53
    Points
    53
    Par défaut Problème dans ma fonction
    Bonjour à tous,

    J'ai un problème dans mon for: pouvez vous le régler svp? (je suis débutant en sql: et c'est la première fois que je fais une boucle for en sql...

    Le problème se situe au niveau de Update Historique SET Hit_or_miss="true";

    Explication du trigger
    Au début j'ai historique(FilmID,SouscriID,UtilisID)que j'ai remplis
    Puis j'ajoute une colonne hit_or_miss qui est un boolean. Ce boolean renvoie true sosu certaine condition et false dans dautre. Et ce trigger va essayer de mettre à jour la colonne hit_or_miss

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    CREATE OR REPLACE FUNCTION functionHit_or_miss_version()
    returns  trigger as
    $$
    DECLARE 
    i record;
    hit_or_miss boolean;
    BEGIN
    FOR i IN Select FilmID FROM historique 
    LOOP
    IF (Select GenreID from definieSur where definieSur.GenreID IN (Select genreID from caracteriser))
    THEN 
    Update Historique SET hit_or_miss="true";
    ELSE 
    Update Historique SET hit_or_miss="false";
    END IF;
    Return Next i;
    END LOOP;
    RETURN;
    END;
    $$
    LANGUAGE 'plpgsql';
     
     
    CREATE TRIGGER INSERTIONHistorique
    AFTER Insert  ON Historique
    FOR each statement 
    execute procedure functionHit_or_miss_version();
    Merci d'avance

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    hit_or_miss est'il une colonne de votre table historique
    car vous la définissez comme variable au début du script?

    De même vous mettez à jour la table entière historique! sans filtrer sur FilmdID...


    Détaillez votre erreur...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Dans cette discussion, vous semblez travailler sous SQL Server.

    Le trigger serait dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TRIGGER monTrigger
    	ON maTable
    	AFTER INSERT
    AS
    BEGIN
    	UPDATE		historique
    	SET		hit_or_miss = CASE WHEN DS.GenreId IS NULL THEN 'True' ELSE 'False' END
    	FROM		historique AS H
    	LEFT JOIN	definieSur AS DS ON ???
    	LEFT JOIN	caracteriser AS C ON C.genreID = DS.genreID
    	INNER JOIN	inserted AS I ON I.cle_primaire = H.cle_primaire
    END

  4. #4
    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
    Citation Envoyé par elsuket Voir le message
    Dans cette discussion, vous semblez travailler sous SQL Server.
    Non il s'agit de postgresql, c'est pourquoi il y a une fonction et un CREATE TRIGGER séparés.
    Le RETURN NEXT i dans la fonction est une erreur car cette construction est réservée aux fonctions qui retournent un ensemble de tuples (SETOF quelquechose) ce qui n'est pas le cas des fonctions utilisables en TRIGGER.
    Du coup la boucle FOR elle-même n'a pas de sens et pour ma part je ne saisis pas du tout la logique de ce bout de code.

Discussions similaires

  1. probléme dans une fonction qui retourne un data reader
    Par saraenim dans le forum Windows Forms
    Réponses: 32
    Dernier message: 28/04/2008, 21h53
  2. Problème dans une fonction PL/SQL
    Par jnayna86 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/04/2008, 13h28
  3. Problème dans ma fonction
    Par El-Diablo- dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/01/2008, 13h06
  4. Problème dans une fonction
    Par onefootstep dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/11/2006, 09h46
  5. [Debutant] Problème dans une fonction
    Par haludo dans le forum Langage
    Réponses: 4
    Dernier message: 19/10/2006, 09h25

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