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 :

Aide sur syntaxe des fonctions


Sujet :

PostgreSQL

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut Aide sur syntaxe des fonctions
    Bonjour à tous,

    Je suis actuellement en train de traduire des procédures stockées faites pour iSeries, pour une base Postgres, et je rencontre quelques soucis qui ne me semblent pas complexes mais je tourne en rond.

    Cette procedure me retourne des enregistrements et selon les valeurs passées en paramètres, la requête exécutée est légèrement différente.

    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
    CREATE FUNCTION P0600 (
    IN V0 SMALLINT
    , IN V1 CHARACTER(5)
    , IN V2 CHARACTER(5)
    , IN V3 CHARACTER(8)
    , IN V4 CHARACTER(8)
    )
    RETURNS SETOF P0600_T AS
    $$
    DECLARE 
    rec P0600_T;
    I1 VARCHAR(5000);
    begin
    I1 = 'MaRequete WHERE Champ1 =  ''' || V1 || ''' AND Champ2 = ''' || V2 || '''';
    IF v0 = 1 THEN
    I1 = I1 || ' AND ((Champ3 >= ' || V3 || ' AND Champ4 < ' || V4 || ')
    )';
    ELSE
    I1 = I1 || 'suite requete';
    END IF;
    FOR rec IN I1
     LOOP
       RETURN NEXT rec ;
     END LOOP ;
    RETURN ;
    END;
    $$
    LANGUAGE 'plpgsql';
    Voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ERROR:  syntax error at or near "$1" at character 3
    QUERY:    $1 
    CONTEXT:  SQL statement in PL/PgSQL function "p0600" near line 18
    Le SQL en lui-même est bon mais je sais que le problème vient de mes déclarations variables, surtout de I1 qui me sert à construire la requête.

    Je vous remercie pour votre aide et vos éclaircissements.

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut
    Finalement, au lieu de m'enfoncer dans le plpgsql, je repasser sur du sql. Je rencontre moins de problème mais je pense que je solliciterai votre aide de nouveau ^^.

  3. #3
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 285
    Points
    7 285
    Par défaut
    Comme ça, à chaud, je verrais plutôt un truc comme ça:

    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
     
    CREATE FUNCTION P0600 
    (
    	v0 SMALLINT, 
    	v1 CHARACTER(5), 
    	v2 CHARACTER(5), 
    	v3 CHARACTER(8), 
    	v4 CHARACTER(8)
    )
    RETURNS SETOF P0600_T AS
    $$
    DECLARE rec P0600_T;
    		marequete text DEFAULT NULL;
    BEGIN
     
    	marequete := 'MaRequete WHERE "Champ1" =  \'' || v1 || '\' AND "Champ2" = \'' || v2 || '\'';
     
    	IF v0 = 1 THEN
    		marequete := marequete || ' AND (("Champ3" >= \'' || v3 || '\' AND "Champ4" < \'' || v4 || '\'))';
    	ELSE
    		marequete := marequete || 'suite requete';
    	END IF;
     
    	FOR rec IN EXECUTE marequete LOOP
    	   RETURN NEXT rec ;
    	END LOOP; 
     
    	RETURN;
    END $$ LANGUAGE plpgsql;
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

Discussions similaires

  1. Syntaxe des fonctions
    Par Caius Suelburnus dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/01/2011, 16h57
  2. aide sur syntaxe c#
    Par joebiloute dans le forum C#
    Réponses: 2
    Dernier message: 14/09/2010, 14h37
  3. Aide sur syntaxe requête.
    Par Nessie37 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 14/11/2007, 18h14
  4. Aide pour inclure des fonctions
    Par naruto_dz dans le forum Débuter
    Réponses: 4
    Dernier message: 25/09/2007, 15h23
  5. Aide sur syntaxe VB
    Par Daniel MOREAU dans le forum Access
    Réponses: 3
    Dernier message: 29/11/2005, 17h47

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