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 :

[Débutant][8.2] Aide syntaxe Fonction SQL


Sujet :

PostgreSQL

  1. #1
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 395
    Par défaut [Débutant][8.2] Aide syntaxe Fonction SQL
    Bonjour à tous,

    Me revoilà donc avec un problème de syntaxe sur ma création de procédure. Visiblement, le problème viendrait du DECLARE non reconnu en LANGUAGE SQL (d'après un vieux sujet du forum) mais ça me surprend.

    Voici le 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
    CREATE FUNCTION P0600 (
    IN V0 SMALLINT
    , IN V1 CHAR(5)
    , IN V2 CHAR(5)
    , IN V3 CHAR(8)
    , IN V4 CHAR(8)
    ) RETURNS refcursor as
    $$
    DECLARE 
    ref refcursor;
    I1 VARCHAR(5000);
    BEGIN
    SET I1 = 'SELECT F0600.F0600_00, F0600_01, F0600_02, F0600_03, F0600_04, F0600_05, F0600_06, F0600_08, F0600_11, F0600_12,
    	F0601.F0601_00, F0601.F0602_00, F0601.F0603_00, F0601.F0606_00, F0600_13, F0600_16, F0600_17, F0600_18, F0600.F0603_00, F0600.F0606_00,
    	F0600_19, F0600_20, F0600_21, F0600_22, F0600_23, F0600_24
    	FROM F0600 AS F0600
    	LEFT OUTER JOIN F0609 AS F0609 ON F0609.F0600_00 = F0600.F0600_00
    	LEFT OUTER JOIN F0601 AS F0601 ON F0601.F0601_00 = F0609.F0601_00
    	WHERE F0600.F0001_00 =  ''' || V1 || ''' AND F0600.F0002_00 = ''' || V2 || '''';
    IF V0 = 1 THEN 
    	SET I1 = I1 || ' AND ((F0601_03 >= ' || V3 || ' AND F0601_03 < ' || V4 || ')
    	AND F0601.F0601_00 IS NOT NULL AND F0601.F0602_00 IS NOT NULL AND F0601.F0603_00 IS NOT NULL AND F0601.F0606_00 IS NOT NULL)';
    ELSE
    	SET I1 = I1 || ' AND (F0601.F0601_00 IS NULL OR F0601.F0602_00 IS NULL OR F0601.F0603_00 IS NULL OR F0601.F0606_00 IS NULL)';
    END IF;
    OPEN ref FOR I1;
    RETURN ref;
    END;
    $$
    LANGUAGE 'SQL';
    Voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR:  syntax error at or near "refcursor" at character 152
    Merci pour votre aide

  2. #2
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 395
    Par défaut
    Finalement plpgsql a été le plus fort.

    Voici donc ma procédure qui fonctionne en pgplsql :
    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
    CREATE FUNCTION P0600 (
    IN V0 INTEGER
    , IN V1 VARCHAR(5)
    , IN V2 VARCHAR(5)
    , IN V3 VARCHAR(8)
    , IN V4 VARCHAR(8)
    )
    RETURNS SETOF p0600_t AS
    $$
    DECLARE 
    rec p0600_t%rowtype;
    I1 VARCHAR(5000);
    begin
    I1 := 'SELECT F0600.F0600_00, F0600_01, F0600_02, F0600_03, F0600_04, F0600_05, F0600_06, F0600_08, F0600_11, F0600_12,
    F0601.F0601_00, F0601.F0602_00, F0601.F0603_00, F0601.F0606_00, F0600_13, F0600_16, F0600_17, F0600_18, F0600.F0603_00, F0600.F0606_00,
    F0600_19, F0600_20, F0600_21, F0600_22, F0600_23, F0600_24
    FROM F0600 AS F0600
    LEFT OUTER JOIN F0609 AS F0609 ON F0609.F0600_00 = F0600.F0600_00
    LEFT OUTER JOIN F0601 AS F0601 ON F0601.F0601_00 = F0609.F0601_00
    WHERE F0600.F0001_00 =  ''' || V1 || ''' AND F0600.F0002_00 = ''' || V2 || '''';
    IF (V0 = 1) THEN
    I1 := I1 || ' AND ((F0601_03 >= ' || V3 || ' AND F0601_03 < ' || V4 || ')
    AND F0601.F0601_00 IS NOT NULL AND F0601.F0602_00 IS NOT NULL AND F0601.F0603_00 IS NOT NULL AND F0601.F0606_00 IS NOT NULL)';
    ELSE
    I1 := I1 || ' AND (F0601.F0601_00 IS NULL OR F0601.F0602_00 IS NULL OR F0601.F0603_00 IS NULL OR F0601.F0606_00 IS NULL)';
    END IF;
    FOR rec IN EXECUTE I1
    LOOP
    RETURN NEXT rec;
    END LOOP; 
    END;
    $$
    LANGUAGE 'plpgsql';

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

Discussions similaires

  1. [Débutant] Appel d'une fonction + SQL Server
    Par SupaDan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/05/2008, 12h14
  2. AIDE SUR REQUETE SQL AVEC FONCTION LIKE
    Par everblue dans le forum Langage SQL
    Réponses: 0
    Dernier message: 16/03/2008, 18h56
  3. aide Syntaxe SQL
    Par friiitz dans le forum Requêtes
    Réponses: 6
    Dernier message: 14/05/2007, 12h39
  4. Syntaxe de la fonction SQL month() ??
    Par merlubreizh dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/09/2005, 11h16
  5. [Débutant] Aide utilisation fonctions :(
    Par trakiss dans le forum Débuter
    Réponses: 10
    Dernier message: 27/08/2004, 15h59

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