Vous n'êtes pas identifié(e).
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
Quel erreur avez-vous ?
Guillaume.
Hors ligne
l'opérateur n'existe pas : text ||
Hors ligne
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
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
comment faire pour indiquer à la requète que "cameron" doit ètre une valeur d'attribut mais pas un attrbut?
Hors ligne
right_attribut || '= ''cameron''';
Dernière modification par arthurr (31/05/2011 12:20:58)
Hors ligne
ca ne marche pas non plus javais déja essayé cela mais il considère "Cameron " comme une colonne
Hors ligne
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
ok la fonction quote_literal() est prédéfinie ds postgree?
Hors ligne
Oui. Sauf si vous aviez une très très vieille version. Ça existe au moins depuis la 7.2…
Marc.
Hors ligne
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
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
avec les balises c'est mieux lol
EXCUTE 'select count('|| left_attribut ||') from film where acteur = "cameron"';
Hors ligne
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
oui ça passe sans le count
Hors ligne
ok. À moins que ça soit une erreur de copier-coller, essayez avec un E à EXECUTE
Marc.
Hors ligne
pffff oui c'était bien cela le E, ben merçi bien.
Hors ligne
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
C'est quoi l'erreur exacte ? Je ne vois pas d'erreur évidente ici.
Marc.
Hors ligne
erreur: le type quote literal n'existe pas
Hors ligne
pourtant ça marché qd j'enlève la partie " and ' ||left_attribut|| '=' || quote_literal(val1) "
Hors ligne
Pouvez-vous coller toute la fonction ? Ça sera plus rapide à tester.
Marc.
Hors ligne
Non, ça y est, vu, vous avez oublié le || devant le ' and
Marc.
Hors ligne
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