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 régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    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 éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    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 habitué 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
    Points : 197
    Points
    197
    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';
    Sud04

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    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 régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    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 habitué 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
    Points : 197
    Points
    197
    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é ?
    Sud04

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    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