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 :

Erreur concaténation dans une fonction


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Erreur concaténation dans une fonction
    Bonjour je n'arrive pas à créer ma fonction a cause de la concaténation, voici mon code
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    CREATE FUNCTION fn_giteqbe(
    	id_dep integer,
    	name_ville character varying,
    	id_reg integer,
    	chambre_min integer,
    	chambre_max integer,
    	couchage_min integer,
    	couchage_max integer,
    	surface_min integer,
    	surface_max integer)
        RETURNS TABLE(id_gite integer, nom_gite character varying, surface_habitable integer, nb_chambres integer, nb_couchages integer, id_personne integer, nom_personne character varying, numero_telephone character varying, email character varying, id_ville integer, code_insee character varying, nom_ville character varying, code_postal character varying, latitude double precision, longitude double precision, id_departement integer, nom_departement character varying, code_departement character varying, id_region integer, nom_region character varying, code_region character varying, id_proprietaire integer, nom_proprio character varying, numero_telephone_proprio character varying, email_proprio character varying, adresse character varying, adresse_2 character varying) 
        LANGUAGE 'plpgsql'
     
        COST 100
        VOLATILE 
        ROWS 1000
    AS $BODY$
    DECLARE clause varchar;
    DECLARE dep varchar;
    DECLARE ville varchar;
    DECLARE region varchar;
    DECLARE chambre varchar;
    DECLARE couchage varchar;
    DECLARE surface varchar;
     
    BEGIN
    IF id_dep IS NULL then
    dep := 'WHERE 1=1 ';
    else
    dep := 'WHERE v.id_departement = ' || id_dep; 
    end if;
    IF name_ville is null then
    ville := ' ';
    else
    ville := ' AND v.nom_ville like ' || chr(39) || '%' || name_ville || '%' || chr(39);
    end if;
    IF id_reg is null then
    region := ' ';
    else
    region := ' AND r.id_region = ' || id_reg ;
    end if;
    IF chambre_min is null then
    chambre_min := 1;
    end if;
    IF chambre_max is null then
    chambre_max := 15;
    end if;
    chambre := ' AND nb_chambres between ' || chambre_min || ' AND ' || chambre_max;
    IF couchage_min is null then
    couchage_min := 1;
    end if;
    IF couchage_max is null then
    couchage_max := 50;
    end if;
    couchage := ' AND nb_couchages between ' || couchage_min || ' AND ' || couchage_max;
    IF surface_min is null then
    surface_min := 40;
    end if;
    IF surface_max is null then
    surface_max := 300;
    end if;
    surface := ' AND surface_habitable between ' || surface_min || ' AND ' || surface_max;
     
    clause := 'SELECT g.id_gite , g.nom_gite 
                   , g.surface_habitable 
    				, g.nb_chambres 
    				, g.nb_couchages 
    				, g.id_personne
    				, p1.nom_personne 
    				, p1.numero_telephone 
    				, p1.email 
    				, g.id_ville 
    				, v.code_insee 
    				, v.nom_ville
    				, v.code_postal 
    				, v.latitude 
    				, v.longitude 
    				, v.id_departement 
    				, d.nom_departement
    				, d.code_departement
    				, d.id_region 
    				, r.nom_region 
    				, r.code_region 
    				, g.id_proprietaire 
    				, p2.nom_personne as nom_proprio
    				, p2.numero_telephone as numero_telephone_proprio
    				, p2.email as email_proprio
    				, g.adresse
    				, g.adresse_2
       FROM  gite as g join personne as p1
    					on g.id_personne = p1.id_personne 
    					join personne as p2 on g.id_proprietaire = p2.id_personne
                        join ville as v on 
    					g.id_ville = v.id_ville join departement as d 
    					on v.id_departement = d.id_departement
                        join region as r on d.id_region = r.id_region ';
       RETURN QUERY
       SELECT * FROM (clause || dep || ville || region || chambre || couchage || surface);
    END
    $BODY$;
     
    ALTER FUNCTION public.fn_giteqbe(integer, character varying, integer, integer, integer, integer, integer, integer, integer)
        OWNER TO postgres;
    L'erreur surgit sur le "||" entre clause et dep

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 439
    Points
    28 439
    Par défaut
    Et en convertissant explicitement les entiers en chaine... ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Ce n'est pas des entiers que je veux convertir

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 439
    Points
    28 439
    Par défaut
    Je n'avais pas été suffisament loin dans l'étude du code...
    L'erreur est dans cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (clause || dep || ville || region || chambre || couchage || surface);
    Ce type de code ne peut pas s'exécuter directement. Il faut passer par du SQL dynamique (commande EXECUTE IMMEDIATE).

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    En effet, cela me renvoie quelquechose, cependant, tout est dans la même colonne nommé fn_giteqbe, les données étant séparés par une virgule comme pour un fichier csv, je ne comprend pas

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Update : Il fallait faire select * from ma_fonction au lieu de select ma_fonction !
    Merci de votre aide

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

Discussions similaires

  1. [AC-2007] Concaténation dans une fonction et dans une requéte InsertInto
    Par Max_Agaki dans le forum VBA Access
    Réponses: 5
    Dernier message: 29/01/2015, 14h32
  2. erreur ios_base dans une fonction qui renvoie un fichier.
    Par jamsgoodon dans le forum Débuter
    Réponses: 3
    Dernier message: 03/03/2011, 17h57
  3. [AC-2002] Erreur 91 dans une fonction
    Par Nightwing367 dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/01/2011, 16h19
  4. Erreur Introuvable dans une fonction
    Par djisse dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2009, 23h08
  5. Erreur Mismatch dans une fonction qui rempli une liste déroulante
    Par MisNiak dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/12/2008, 17h11

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