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 :

un newbie avec plpgsql


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut un newbie avec plpgsql
    Salut,

    Je suis débutant avec postgres, mais pas avec les sgbd. J'ai donc un probleme avec le langage pl/pgsql. Je veux créer une table qui contient une itération d'entier et dit si c un pair ou un impair plus deux multiplication(bref un cas d'école pour apprendre) dans une fonction.
    voici ce que j'ai fait:
    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
     
    CREATE OR REPLACE FUNCTION "public"."la_parite" (INTEGER) RETURNS VARCHAR
        AS'
        BEGIN
          IF mod($1, 2) != 0 THEN
            RETURN "impaire";
          ELSE
            RETURN "pair";
          END IF;
        END;
      'LANGUAGE 'plpgsql';
     
     
     
    CREATE OR REPLACE FUNCTION "public"."tab_parite" (void)
    RETURNS void
    AS'
     
    DECLARE
      i INTEGER;
      requete := "CREATE TABLE tmp1(
        i INTEGER CONSTRAINT PRIMARY KEY,
        PARITE VARCHAR(10),
        i**2 INTEGER,
        i**3 INTEGER)";
    BEGIN
      EXECUTE requete;
     
      FOR i IN 1 10
        LOOP
          EXECUTE "INSERT INTO tmp1 values( i," || la_parite( i ) || ", i*2, i*3)";
        END LOOP;
     
       RETURN;
    END;
     
    'LANGUAGE 'plpgsql';
    Lorsque je fait dans ma console un ' SELECT la_parite(2); ' et bien il me dit que la colonne pair n'existe pas.
    Et si je veux exécuter tab_parite alors la ca me dit que la fonction n'existe pas.

    alors que lors de l'execution du fichier contenant les fonctions j'ai eu le resultat:
    CREATE FUNCTION
    CREATE FUNCTION

    Si qq peut m'aider pour débuter en pl/pgsql...

    Merci

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut
    Je rajouterais une question: Peut on faire un create dans une fonction car pour l'instant je n'ai vu dans aucun exemple un create dans une fonction. Et je crois qu'on ne peu pas utiliser EXECUTE pour un create.

    Merci d'avance

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut
    Bon j'ai un semblant de réponse. Je me fais mon topic à moi tout seul, question et réponse. lol
    Bon voici maintenant ce que j'ai:

    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
     
    CREATE OR REPLACE FUNCTION la_parite (INTEGER) RETURNS VARCHAR
        AS '
        BEGIN
          IF $1%2 != 0 THEN
            RETURN \'impaire\';
          ELSE
            RETURN \'pair\';
          END IF;
        END;
      'LANGUAGE 'plpgsql';
     
    CREATE OR REPLACE FUNCTION tab_parite () RETURNS void
    AS'
     
    DECLARE
      i INTEGER;
    BEGIN
     CREATE TABLE tmp1(
        i INTEGER CONSTRAINT pk PRIMARY KEY,
        la_parite VARCHAR(10),
        ifois2 INTEGER,
        ifois3 INTEGER);
      FOR i IN 1..10
        LOOP
          EXECUTE ''INSERT INTO tmp1 VALUES( '' i '','' || la_parite( i ) || '', ''\
     i*2 '', '' i*3 '')'';
        END LOOP;
     
       RETURN;
    END;
    'LANGUAGE 'plpgsql';
    Bref maintenant lorsque j'execute la_parite(5) il me rend bien impaire
    mais lorsque j'execute tab_parite() il me dit:

    ERROR: syntax error at or near "$1" at character 21
    CONTEXT: PL/pgSQL function "tab_parite" line 5 at SQL statement


    Si quelqu'un peu m'aider, j'en ai marre de lire la doc.......

  4. #4
    Membre Expert
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Par défaut
    salut,
    l'histoire du $1 en erreur, ton create table a un champ qui s'appelle i et une variable i .... donc petit probleme !
    j'ai renommer en id mais tu peux changer la variable.

    ton insert avait un petit soucis : il faut tout concatener meme les integer.
    La fonction la_parite renvoi une chaine donc utilise quote_literal sinon pg va penser que pair ou impair est une colonne.

    j'ai mis $body$ pour eviter de se prendre la tete avec les quotes

    bref la fonction donnerai quelque chose comme :

    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
    CREATE OR REPLACE FUNCTION tab_parite () RETURNS void AS
    $body$
    DECLARE
      i INTEGER;
    BEGIN
     CREATE TABLE tmp1(
        id INTEGER CONSTRAINT pk PRIMARY KEY,
        la_parite VARCHAR(10),
        ifois2 INTEGER,
        ifois3 INTEGER);
      FOR i IN 1..10
        LOOP   
          EXECUTE 'INSERT INTO tmp1 VALUES( '|| i ||',' ||quote_literal( la_parite( i )) || ', ' || i*2 ||', '|| i*3 ||')';
        END LOOP;
     
       RETURN;
    END;
    $body$
    LANGUAGE 'plpgsql' ;
    fait quand meme attention il faudrait que tu fasse un test d'existance de la table avant de faire le create, parce que sinon plantage au 2eme create

    j'espere que je t'aurai un peu aider et bon courage

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut
    Oui merci pour ton aide. Je n'avais pas pensé au quote et au i qui pouvait poser probleme. Par contre le if exists j'y ai pensé mais c'est vrai qu'il faut que je le mette.
    Et en dernier lieu je dit snif car j'avais essayé le quote $ qui ne marche toujours pas. Je sais pas pourquoi mais il me dit

    psql:tmmp.sql:4: ERROR: syntax error at or near "$" at character 59
    psql:tmmp.sql:10: ERROR: syntax error at or near "CREATE" at character 9
    .....

    Si tu sais pourquoi?? Sinon je repasse en quote qui n'en finissent pas. lol

Discussions similaires

  1. Développer des fonctions scalaires (UDF) avec PLpgSQL
    Par SQLpro dans le forum Débuter
    Réponses: 1
    Dernier message: 20/06/2011, 10h09
  2. [Mappy] Newbie avec un token, ne sait pas comment s'en servir
    Par Repitol dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 22/04/2011, 14h26
  3. Réponses: 2
    Dernier message: 15/03/2009, 12h45
  4. afficher une variable ou chaine avec PLPGSQL
    Par doudoudon dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 14/08/2006, 13h46
  5. [CVS]NewBie avec Eclipse
    Par sylvain_neus dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/12/2005, 12h55

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