Vous n'êtes pas identifié(e).

#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

Pied de page des forums