Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/05/2007, 18h20   #1
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
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 :
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
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 08h39   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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 :
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 10h23   #3
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
Code :
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';
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 10h28   #4
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
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 :
1
2
 
SELECT COUNT(clone_id) FROM clone WHERE clone_id ILIKE '%AATG%';
Ce qui me renvoie par exemple :

Code :
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 :
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
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 11h09   #5
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
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 :
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
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 11h17   #6
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
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 :
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é ?
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 14h12   #7
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
J'ai essayé avec ton exemple et en essayant d'ajuster les quotes

Code :
1
2
 
 EXECUTE 'SELECT COUNT(clone_id) FROM clone WHERE clone_id ILIKE ''%'' || clone_name || ''%''' INTO res;
mais j'ai une erreur :

Code :
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 :
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
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h12.


 
 
 
 
Partenaires

Hébergement Web