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 :

retourner un count() par une fonction PL/pgSQL ?


Sujet :

PostgreSQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Par défaut retourner un count() par une fonction PL/pgSQL ?
    Bonjour,

    J'ai un petit problème avec PL/pgSQL, je souhaite créer une fonction renvoyant un count() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE FUNCTION compter(TEXT) RETURNS BIGINT AS '
    DECLARE
     clone_name ALIAS FOR $1;
     res BIGINT;
    BEGIN
     SELECT COUNT(clone_id) INTO res FROM clone WHERE clone_id ILIKE ''%clone_name%''
     RETURN res;
    END;
    ' LANGUAGE 'PLPGSQL';
     
    précision pour ''%clone_name%'': ce sont de simples quote.
    Ceci me renvoie 0.

    Je me demande si clone_name est interprété à l'interieur du regex.

    Sauriez-vous comment y remédier ?

    En vous remerciant,

    C. Tobini

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    Citation Envoyé par ctobini
    Je me demande si clone_name est interprété à l'interieur du regex.
    Non effectivement, il ne l'est pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(clone_id) INTO res FROM clone WHERE clone_id ILIKE ''%'' || clone_name
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre expérimenté Avatar de budtucker
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 176
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE FUNCTION compter(clone_name TEXT) RETURNS BIGINT AS '
    DECLARE
     res BIGINT;
    BEGIN
     execute 'SELECT COUNT(clone_id) FROM clone WHERE clone_id ILIKE ''%' || clone_name ||'%''' into res;
     RETURN res;
    END;
    ' LANGUAGE 'PLPGSQL';

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Par défaut
    Bonjour et merci de la réponse,

    Je saisis la forme mais dans mon cas j'ai toujours 0 étant donné que je recherche une séquence de quelques caractères dans une séquence plus importante.

    Avec un regex 'normal' de requête j'utiliserais par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT COUNT(clone_id) FROM clone WHERE clone_id ILIKE '%AATG%';
    Ce qui me renvoie par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    clone_id
    -----------
    HJU_AATG_0101
    HJU_AATG_0102
    HJU_AATG_0103
    Du coup si le regex est écrit de cette manière dans une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BEGIN
     ... ILIKE ''%'' || clone_name
    END;
    ...
    Comment indiquer les % du regex pour préciser qu'il y a des caractères avant et après clone_name ?

    C. Tobini

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Par défaut
    Désolé de la précédente réponse, je n'avais pas vu le post de budtucker entretemps, du coup j'ai la réponse

    Je pensais que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN
    ... ''%'' || clone_name
    END;
    envoyait un argument et % le récupérait (comme un printf("%s", clone_name) par exemple).

    Par contre budtucker, il me semble que EXECUTE ne fonctionne que si un évenement a été PREPARE avant, je ne sais pas si c'est valide dans ce contexte.

    C. Tobini

  6. #6
    Membre expérimenté Avatar de budtucker
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 176
    Par défaut
    Citation Envoyé par ctobini
    Désolé de la précédente réponse, je n'avais pas vu le post de budtucker entretemps, du coup j'ai la réponse

    Je pensais que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN
    ... ''%'' || clone_name
    END;
    envoyait un argument et % le récupérait (comme un printf("%s", clone_name) par exemple).

    Par contre budtucker, il me semble que EXECUTE ne fonctionne que si un évenement a été PREPARE avant, je ne sais pas si c'est valide dans ce contexte.

    C. Tobini
    Pour une procedure en SQL, EXECUTE ne fonctionne qu'avec un PREPARE. pas avec en plpg/sql. Pourrais tu tester la procedure que je t'ai envoyé ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Par défaut
    J'ai essayé avec ton exemple et en essayant d'ajuster les quotes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     EXECUTE 'SELECT COUNT(clone_id) FROM clone WHERE clone_id ILIKE ''%'' || clone_name || ''%''' INTO res;
    mais j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR:  erreur de syntaxe sur ou près de «select»
    LINE 8:  execute 'select count(clone_id) from clone where clone_id i...
    Voici la fonction si tu veux créer une table clone avec juste un ou deux exemples clone_id pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create function compter(text) returns bigint as '
    declare
     clone_name ALIAS FOR $1;
     res bigint;
    begin
     -- select count(clone_id) from clone where clone_id ilike ''%'' || clone_name || ''%'' into res;
     -- res := (select count(clone_id) from clone where clone_id ilike ''%'' || clone_name || ''%'');
     execute 'select count(clone_id) from clone where clone_id ilike ''%'' || clone_name || ''%''' into res;
     return res;
    end;
    ' language 'plpgsql';
    A noter que les 2 attributions commentés de la variable 'res' fonctionnent.

    C. Tobini

Discussions similaires

  1. [MySQL] Retourner un tableau par une fonction
    Par te-san dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/11/2009, 16h26
  2. Retourner un Resultset par une fonction
    Par switch1 dans le forum JDBC
    Réponses: 9
    Dernier message: 19/02/2009, 15h44
  3. Tracer les requêtes exécutées par une fonction PL/PgSQL
    Par scheu dans le forum Administration
    Réponses: 1
    Dernier message: 02/02/2009, 14h01
  4. retourner un vector a 2 dimensions par une fonction
    Par Psykotik dans le forum SL & STL
    Réponses: 7
    Dernier message: 18/11/2005, 17h45
  5. Réponses: 11
    Dernier message: 31/10/2005, 17h59

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