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 "colonne n'existe pas" / function plsql


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Problème "colonne n'existe pas" / function plsql
    Bonjour,

    Je dois faire une fonction qui renvoie le nombre de ligne d'une table.
    Voila 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
     
    DROP TABLE IF EXISTS test;
     
    CREATE TABLE test(
        id serial,
        nom varchar
    );
     
    INSERT INTO test VALUES(default, 'Thomas');
    INSERT INTO test VALUES(default, 'Cédric');
    INSERT INTO test VALUES(default, 'David');
    INSERT INTO test VALUES(default, 'Nicolas');
     
    DROP FUNCTION IF EXISTS number_line(varchar);
     
    CREATE FUNCTION
    number_line(nom_table varchar)
    RETURNS integer AS $$
    DECLARE
        n integer;
    BEGIN
        SELECT INTO n
            COUNT(*)
            FROM nom_table;
        RETURN n;
    END;
    $$ LANGUAGE plpgsql;


    Seulement j'obtient l'erruer suivante:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BDD=# select number_line(test);
    ERREUR:  la colonne « test » n'existe pas
    LIGNE 1 : select number_line(test);


    Pourriez-vous m'aider?

  2. #2
    Modérateur

    Deux problèmes :
    1. test n'est pas une chaîne de caractères.
      'test' en est une.
    2. Dans la fonction number_line, il faut utiliser du SQL dynamique.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Nouveau membre du Club
    Merci de ton aide.

    Du coup, en cherchant sur le net (https://stackoverflow.com/questions/43211749/dynamic-sql-with-table-name-as-a-parameter)j'en suis venu à écrire cela:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE OR REPLACE FUNCTION
    number_line(nom_table varchar)
    RETURNS integer AS $$
    DECLARE
        query varchar;
        n integer;
    BEGIN
        query := 'SELECT INTO n COUNT(*) FROM' || nom_table;
        EXECUTE IMMEDIATE query;
        RETURN n;
    END;
    $$ LANGUAGE plpgsql;


    Seulement la même erreur persiste.

  4. #4
    Modérateur

    C'est sans doute que la première erreur n'a pas été corrigée
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Membre actif
    Votre requête est mal construite

    Citation Envoyé par Zyxcel314 Voir le message
    Merci de ton aide.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
        query := 'SELECT INTO n COUNT(*) FROM' || nom_table;
        EXECUTE IMMEDIATE query;


    Faites plutôt ceci
    Et n'ouliez pas l'espace après le FROM :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
        query := 'SELECT COUNT(*) FROM ' || nom_table;
        EXECUTE query INTO n;
        RETURN n;


    Testez comme ceci

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    SELECT number_line('test')

###raw>template_hook.ano_emploi###