Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 30/05/2011 20:26:57
- lioneleder
- Membre
fonction pl gsql
Bonjour
j'essai en fait de d'crire une fonction qui prend en paramètre deux attirbuts et ses valeurs et un nom de table sans succès.
Ma fonction doit effectuer des recherches en fonction de ces paramètres
Comment faire ?
Merçi
CREATE OR REPLACE FUNCTION multivaluate_dependancy(
left_attribut character varying,
right_attribut character varying,
tab character varying
)
returns boolean as $$
DECLARE
i integer ;
i1 integer ;
bool boolean:=true ;
lio character varying;
BEGIN
EXECUTE 'select ' || left_attribut || ' into lio from '||tab||' where' ||right_attribut|| = 'cameron';
return bool;
END;
$$LANGUAGE 'plpgsql'
SECURITY DEFINER;
Hors ligne
#2 30/05/2011 21:38:16
- gleu
- Administrateur
Re : fonction pl gsql
Quel erreur avez-vous ?
Guillaume.
Hors ligne
#3 30/05/2011 22:25:51
- lioneleder
- Membre
Re : fonction pl gsql
l'opérateur n'existe pas : text ||
Hors ligne
#4 30/05/2011 23:56:43
- gleu
- Administrateur
Re : fonction pl gsql
La partie
EXECUTE 'select ' || left_attribut || ' into lio from '||tab||' where' ||right_attribut|| = 'cameron';
est fausse. Le = devrait être dans les guillemets.
Guillaume.
Hors ligne
#5 31/05/2011 00:24:49
- lioneleder
- Membre
Re : fonction pl gsql
ok, mais qd je fait ça après j'ai une erreur du type la colnne <<cameron>> n'existe pas pourtant cameron est valeur d'attribut
merçi.
Hors ligne
#6 31/05/2011 00:30:26
- lioneleder
- Membre
Re : fonction pl gsql
comment faire pour indiquer à la requète que "cameron" doit ètre une valeur d'attribut mais pas un attrbut?
Hors ligne
#7 31/05/2011 11:51:13
- arthurr
- Membre
Re : fonction pl gsql
right_attribut || '= ''cameron''';
Dernière modification par arthurr (31/05/2011 12:20:58)
Hors ligne
#8 31/05/2011 14:34:27
- lioneleder
- Membre
Re : fonction pl gsql
ca ne marche pas non plus javais déja essayé cela mais il considère "Cameron " comme une colonne
Hors ligne
#9 31/05/2011 14:42:36
- Marc Cousin
- Membre
Re : fonction pl gsql
cameron devrait être entre quotes. Il y a plusieurs façons pour ça:
- Les saisir de façon protégée dans les quotes actuels. Cela dépendra de standard_conforming_strings et sera pénible à gérer. Quelque chose comme '\'cameron\''
- Les protéger par la fonction prévue à cet effet: || '=' || quote_literal('cameron')
- Utiliser la syntaxe USING de execute
cf : http://docs.postgresql.fr/9.0/plpgsql-statements.html , paragraphe 39.5.4
Marc.
Hors ligne
#10 31/05/2011 14:54:42
- lioneleder
- Membre
Re : fonction pl gsql
ok la fonction quote_literal() est prédéfinie ds postgree?
Hors ligne
#11 31/05/2011 14:58:09
- Marc Cousin
- Membre
Re : fonction pl gsql
Oui. Sauf si vous aviez une très très vieille version. Ça existe au moins depuis la 7.2…
Marc.
Hors ligne
#12 31/05/2011 16:20:54
- lioneleder
- Membre
Re : fonction pl gsql
Merçi ca marche voilà la bonne syntaxe
CREATE OR REPLACE FUNCTION multivaluate_dependancy(
left_attribut character varying,
right_attribut character varying,
val character varying,
tab character varying
)
returns boolean as $$
DECLARE
i integer ;
i1 integer ;
bool boolean:=true ;
lio character varying;
BEGIN
EXECUTE 'select ' || left_attribut || ' from '||tab||' where ' ||right_attribut|| '=' || quote_literal(val)
into lio;
--EXCUTE 'select count('|| left_attribut ||') from film where acteur = "cameron"';
return bool;
END;
$$LANGUAGE 'plpgsql'
SECURITY DEFINER;
Hors ligne
#13 31/05/2011 16:24:08
- lioneleder
- Membre
Re : fonction pl gsql
maintenant je voudrai faire un select count() et avec un attribut dans mon count. j'ai essayé :
EXCUTE 'select count('|| left_attribut ||') from film where acteur = "cameron"';
mais rien à faire.
es ce que vous avez une solution? Dans les tutos que j'ai lu j'ai rien trouvé.
Merçi.
Hors ligne
#14 31/05/2011 16:26:17
- lioneleder
- Membre
Re : fonction pl gsql
avec les balises c'est mieux lol
EXCUTE 'select count('|| left_attribut ||') from film where acteur = "cameron"';
Hors ligne
#15 31/05/2011 16:27:11
- Marc Cousin
- Membre
Re : fonction pl gsql
Il y a une fonction 'quote_ident' comme quote_literal, au passage. Vous ne pouvez jamais être sûr de ce qui est passé en paramètre de la fonction.
Ça passe, sans le count ?
Marc.
Hors ligne
#16 31/05/2011 16:33:08
- lioneleder
- Membre
Re : fonction pl gsql
oui ça passe sans le count
Hors ligne
#17 31/05/2011 16:36:19
- Marc Cousin
- Membre
Re : fonction pl gsql
ok. À moins que ça soit une erreur de copier-coller, essayez avec un E à EXECUTE
Marc.
Hors ligne
#18 31/05/2011 16:44:23
- lioneleder
- Membre
Re : fonction pl gsql
pffff oui c'était bien cela le E, ben merçi bien.
Hors ligne
#19 03/06/2011 13:07:42
- lioneleder
- Membre
Re : fonction pl gsql
Bonjour, j'ai essaye ce code mais ça marche pas
EXECUTE 'select count('|| left_attribut ||') from ' ||tab||' where ' ||right_attribut|| '=' || quote_literal(val)
' and ' ||left_attribut|| '=' || quote_literal(val1)
into i;
sans ' and ' ||left_attribut|| '=' || quote_literal(val1) ça marche mais qd je rajoute la partie du and j'ai une erreur du type le quote_literal n'existe pas
es -ce que quelqu'un aurrai une réponse
merçi
Hors ligne
#20 03/06/2011 13:19:27
- Marc Cousin
- Membre
Re : fonction pl gsql
C'est quoi l'erreur exacte ? Je ne vois pas d'erreur évidente ici.
Marc.
Hors ligne
#21 03/06/2011 13:22:47
- lioneleder
- Membre
Re : fonction pl gsql
erreur: le type quote literal n'existe pas
Hors ligne
#22 03/06/2011 13:24:06
- lioneleder
- Membre
Re : fonction pl gsql
pourtant ça marché qd j'enlève la partie " and ' ||left_attribut|| '=' || quote_literal(val1) "
Hors ligne
#23 03/06/2011 13:24:23
- Marc Cousin
- Membre
Re : fonction pl gsql
Pouvez-vous coller toute la fonction ? Ça sera plus rapide à tester.
Marc.
Hors ligne
#24 03/06/2011 13:25:24
- Marc Cousin
- Membre
Re : fonction pl gsql
Non, ça y est, vu, vous avez oublié le || devant le ' and
Marc.
Hors ligne
#25 03/06/2011 13:35:31
- lioneleder
- Membre
Re : fonction pl gsql
effectivement,
le || sert à quoi au faite, jai pas bien compris car j'ai pas vraiment eu le tps de lire les doc
mais je croi savoir que l'on l'utilise pr faire savoir au code que l'on utilise des paramètre dynamique, c'est bien ça?
Hors ligne