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 :

Problème de création de fonction


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut Problème de création de fonction
    Bonjour
    je fais encore appel à votre aide pour la création d'une fonction
    Ma fonction en pl/pgSQL est crée mais j'ai toujours null;

    Avant de créer ma fonction j'ai suivi vos conseils de me concentrer d'abord sur ma requête qui est la suivante et elle marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select f.codefilm , titrefilm , annee , duree , intgenre, nomacteur, prenomacteur
    		from film f
    		join genre ge on f.codegenre  = ge.codegenre 
    		join jouer_un_role j on f.codefilm  = j.codefilm 
    		join acteur ac on j.codeacteur = ac.codeacteur
    		and titrefilm = 'Rambo'
    Par la suite j'ai réussi à créer ma fonction sans avoir d'erreur :
    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
    create or replace function infoFilm(varchar) returns varchar
    as $$
     
    DECLARE
    films record;
    parametre alias for $1;
    filminfo varchar;
    absencefilm varchar;
     
     
    Begin
     		for films in select f.codefilm , titrefilm, annee, duree, intgenre, nomacteur, prenomacteur
    		from film f
    		join genre ge on f.codegenre  = ge.codegenre 
    		join jouer_un_role j on f.codefilm  = j.codefilm 
    		join acteur ac on j.codeacteur = ac.codeacteur LOOP
     
    	if films.titrefilm  is not null then
    		filminfo := films.codefilm||' '||films.titrefilm||'( '||films.annee||' '||films.duree||') \n'||  films.intgenre ||'\n'||films.nomacteur||' '||films.prenomacteur; 
    	else
    	 	absencefilm :='Film inexistant';
    	 End If;
    END LOOP;
    	return filminfo;		
    end
    $$ LANGUAGE plpgsql;
    quand j'utilise ma fonction en mettant comme argument le titre d'un film j'ai comme résultat toujours null
    je me pose la question si dans ma variable filminfo je peux stocker tous ce contenu.
    merci pour votre aide

  2. #2
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    --
    1. Votre fonction peut retourner des données sous forme de table
    2. Faire WHERE f.titrefilm = 'Rambo' n'est pas une bonne approche pour faire de la recherche de film par mot clé
    3. Utilisez les fonctions de recherche telles que to_tsvector comme ceci
    4. Les paramètre de retour Returns table ( .... ) doivent être de même type que les colonnes retournées par votre requête


    Code sql : 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
     
    create or replace function infoFilm( recherche varchar ) 
    	returns table (
    		codefilm varchar,
    		titrefilm varchar,
    		annee integer,
    		duree numeric,
    		intgenre integer,
    		nomacteur varchar,
    		prenomacteur varchar
    	)
    	AS $$
     
    BEGIN
     
    	RETURN QUERY
    			SELECT f.codefilm, f.titrefilm, f.annee, f.duree, g.intgenre, a.nomacteur, a.prenomacteur
    			FROM film f
    			JOIN genre g ON g.codegenre = f.codegenre
    			JOIN jouer_un_role j ON j.codefilm = f.codefilm 
    			JOIN acteur a ON a.codeacteur = j.codeacteur
     
    			WHERE to_tsvector( f.titrefilm ) @@ to_tsquery( recherche );
     
    END
    $$ LANGUAGE plpgsql;

    Faire un test comme ceci,
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT codefilm, titrefilm, annee, duree, intgenre, nomacteur, prenomacteur
    FROM infoFilm('Rambo');

  3. #3
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    Votre concatenation filminfo sera nulle si l'une des colonnes est nulle

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    filminfo := films.codefilm||' '||films.titrefilm||'( '||films.annee||' '||films.duree||') \n'||  films.intgenre ||'\n'||films.nomacteur||' '||films.prenomacteur;

    Utilisez la fonction COALESCE('.....', '') pour contourner le problème comme ceci

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    filminfo := COALESCE(films.codefilm, '') || ' ' 
    		COALESCE(films.titrefilm, '') || ' ' 
    		COALESCE(films.annee, '') || ' ' 
    		COALESCE(films.duree, '') || ' ' 
    		COALESCE(films.intgenre, '') || ' ' 
    		COALESCE(films.prenomacteur, '')

  4. #4
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut
    Bonsoir
    je vous remercie encore pour votre aide , concernant ma fonction j'ai apporté les modifications avec coalesce... mais j'avais encore un souci que j'ai résolu en ajoutant la ligne 6 (and titrefilm = parametre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for films in select f.codefilm , titrefilm, annee, duree, intgenre, nomacteur, prenomacteur
    		from film f
    		join genre ge on f.codegenre  = ge.codegenre 
    		join jouer_un_role j on f.codefilm  = j.codefilm 
    		join acteur ac on j.codeacteur = ac.codeacteur
    		and titrefilm = parametre 
    		 LOOP
    Ma fonction enfin marche malgré cela reste du basique, mais ayant eu juste une dizaine d'heures de cours très basique je ne pouvais pas faire mieux. D'ailleurs quand je fais des recherches sur ce forum je rencontre souvent Query je vais me pencher sur votre fonction pour essayer de comprendre.
    Encore merci et bonne soirée

  5. #5
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut
    Bonjour
    Une dernière question dans mon td on me demande de mettre en forme sur trois lignes. Avec ma fonction j'ai essayé \n et aussi j'ai trouvé sur internet char(10) pour aller à la ligne mais ca ne marche pas. Est ce que il est possible de faire un retour de chariot?
    Bonne journée

  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 803
    Points
    30 803
    Par défaut
    Ton affichage attend peut-être des fins de ligne à la mode Windows avec CR et LF (chr(13) || chr(10))
    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 averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    Citation Envoyé par Matteo53 Voir le message
    Avec ma fonction j'ai essayé \n et aussi j'ai trouvé sur internet char(10) pour aller à la ligne mais ca ne marche pas. Est ce que il est possible de faire un retour de chariot?
    Bonne journée
    Quel language utilisez vous côté application ?
    J'avais bien compris que votre concatenation et votre 'Film inexistant' était pour résoudre les problèmes d'affichage.
    Il faut déléguer la mise en forme de votre affichage à l'application, ce n'est pas le rôle de la base de données.
    Faîtes la concatenation dans php, java, c#...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    if films.titrefilm  is not null then
    	filminfo := films.codefilm||' '||films.titrefilm||'( '||films.annee||' '||films.duree||') \n'||  films.intgenre ||'\n'||films.nomacteur||' '||films.prenomacteur; 
    else
    	 absencefilm :='Film inexistant';
    End If;

  8. #8
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut
    Bonsoir
    En fait je fais une formation basique sql, j'utilise pgAdmin pour mes cours , je faisais juste un TD qui me demande de créer cette fonction et il y a un exemple de mise en forme sur 3 lignes. C'est pour cela que j'ai inséré \n (comme en java) mais ca ne fonctionne pas. Je me posais justement la question sur la mise en forme et c'est plus claire pour moi avec votre réponse. La fonction marche donc c'est l'essentiel pour la mise en forme pas grave.
    merci encore pour votre aide et de vos explications très claires.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème à la création de ma fonction sous CLP
    Par batou22003 dans le forum DB2
    Réponses: 5
    Dernier message: 11/04/2012, 10h31
  2. [VBA-W]problèmes de création de fonction
    Par dev81 dans le forum VBA Word
    Réponses: 1
    Dernier message: 26/04/2007, 14h39
  3. Problème de création de fonction
    Par ArnaudD dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 29/09/2006, 22h06
  4. Réponses: 5
    Dernier message: 30/03/2006, 14h52

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