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 10/07/2007, 14h17   #1
Invité de passage
 
Inscription : juillet 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 9
Points : 1
Points : 1
Par défaut besoin d aide pour les fonction en postgresql

bonjour

je suis nouveau ici
je m appelle william et je commence un pojet asser important en
postgresql que j ai jaimmais utiliser

je me pose plein de question et j espere que vous pourier m aider
pour un insert j aimerai utiliser une fonction que j ai decomposer en 1
fonction qui appelle 2 sous fonction,la principale appelle addid et dpass que voici

CREATE OR REPLACE FUNCTION addid(x integer, chaine text)
RETURNS text AS
$BODY$

if x > -1:
if chaine == 'Z'
chaine[x]
chaine = addid (--x,chaine)
else :
if chaine[x]=='9'
chaine[x]='a'
else :
$chaine[x]++
return chaine

return chaine

$BODY$
LANGUAGE 'plpythonu' VOLATILE;

2 la sous fonction

CREATE OR REPLACE FUNCTION dpass()
RETURNS text AS
$BODY$

pass="";
pass[0]=random(a..z);
i=0;
while i<4
pass[I]=random(1..9);

return pass

$BODY$
LANGUAGE 'plpythonu' VOLATILE;

voici la fonction principql que j aimerai appeller en php
---------------------------------------------------------------

CREATE OR REPLACE FUNCTION add_client(nom text, prenom text, mail text)
RETURNS boolean AS
$BODY$

DECLARE
liste record;
id text;
nid text;
npass text;

begin
FOR liste IN select fin_client from index_serveur where id=1 LOOP
id=liste[0];
END LOOP;

nid=addid (5,id);
update index_serveur set fin_client=nid where id=1;

npass= dpass ();
insert into client values (nid,npass,nom,mail,'I','0','',prenom);

return true;
end
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

si tout ca est accepter par l editeur de requete pgqdmin3
je ne suis pas du tout sur que ca fonctionne et que la syntaxe est bonne


question 1
----------------
est qu'on peut faire des sous fonction en postgresql

question 2
---------------
comment tester ca dans pgadmin3

question 3
--------------------
peut on appeller une fonction plpython par une fonction plpgsql

question 4
---------------
j ai reussie a me connecter en php faire un insert ou un select
mais je ne trouve pas comment appeller la fonction en php

question 5
---------------
je tester les fonction en addid et dpass en php ca fonctionne
mais je pense que l execution sera plus rapide sur le serveur sql et plus facile pour les backup ,mais une confirmation de ca serai la bienvenu

un grand merci pour votre aide d'avance

willl
dannw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2007, 14h42   #2
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
Y a t il une raison particulière à passer de fonction plpgslq à python ou l'inverse ? Il vaut mieux n'en garder qu'un seul (perso : plpgsql). Tu peux sans pb appeler une fonction Python dans plpgsql.

Cette partie est bizarre :
Code :
1
2
3
4
5
6
 
FOR liste IN SELECT fin_client FROM index_serveur WHERE id=1 LOOP
id=liste[0];
END LOOP;
 
nid=addid (5,id);
Au début, tu recupères une valeur dans chaque ligne de ta requete et ensuite, tu n'utilises que le dernier !!!

Sur ta fonction "add_client" le type de retour est un boolean, mais tu ne renvoie que true. Ca sert peut être plus à grand chose.

De plus, tu utilises une variable id alors que dans ta requête "where id=1" tu as un id mais en tant que champs.

Je ne connais pas le Python, mais es tu sûr que la syntaxe suivante est correcte :
Code :
1
2
3
             IF chaine == 'Z'
                chaine[x]   // <----------------- A quoi ça sert ???
                chaine = addid (--x,chaine)
Pour tester une fonction, il suffit de faire :
Code :
SELECT nomdelafonction(param1,param2,...);
Tu as du remarquer que dans pgqdmin3 la fonction a été ajouté dans la catégorie "Fonctions". Pour tester la requête, ouvre une fenêtre SQL et lance la requête ci dessus.

sous php :

Code :
$res = pg_query($cn, "SELECT nomdelafonction(param1,param2,...);");
Mais si tout ça fonctionne, Bravo !!

A+
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2007, 17h35   #3
Invité de passage
 
Inscription : juillet 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 9
Points : 1
Points : 1
Par défaut reponse

un grand merci pour ton aide

j ai jammais fait du python
mais je pense qu il est plus adapter a des fonction de chaine de caractere
et je ne vois pas comment faire une fonction recursive en plpgsql

quand a la partie
FOR liste IN SELECT fin_client FROM index_serveur WHERE id=1 LOOP
id=liste[0];
END LOOP;
j ai vue ca sur un autre forum j ai trouver ca bizare aussi

j ai pas encore debuger c est function on elle ete accepter par pgadmi mais n on jammais tourner car je ne savais comment faire maintenant j espere que ca va aller grace a toi

bien vu pour le mauvais non de variable id
je vais suivre tes reponse pour debuguer tout ca

tu pourrai me dire si on peut faire des fonction recursive en plpgsql

quand au chaine[x] il s'agit de tester ou modifier le le cartere x de la string chaine comme dans de nombreux language je dois verifier si sa marche en python

encore merci je revient vert toi une fois les test fait
dannw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 10h06   #4
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
J'ai jamais de récursivité en plpgsql. Je ne sais pas si c'est possible. Si quelqu'un d'autre peut répondre !!!
Citation:
quand au chaine[x] il s'agit de tester ou modifier le le cartere x de la string chaine comme dans de nombreux language je dois verifier si sa marche en python
Je ne comprends pas trop cet enchaînement, mais si ça marche...

A+
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 21h16   #5
Invité de passage
 
Inscription : juillet 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 9
Points : 1
Points : 1
Par défaut probleme de droit

bonjour

j ai essayer tout la journee de faire tournee les fonciton sur le serveur postgresql sans succes estimant perdant beaucoup de temp et n'etant pas sur de pouvoir faire des fonction recusive j ai tout fait en php resulta ca fonctionne et ca va tres vite casi instantané

j ai un autre petit souci j ai mis un captcha et un session ansi que verification de tout les champ mais j aurai voulu rajouter la securiter d une connection avec un user limiter en droit j ai bon tripoter dans pgadmin 3 ca marche pas poutrant j ai

j ai reussi a enlever les droit de postgres par securite
j ai ca dans la table en question
GRANT INSERT ON TABLE client TO insert_client_groupe WITH GRANT OPTION;

et l utilisateur insert_client appartient insert_cl
GRANT inser_cl TO insert_client;

il se connect mais me dit qu il pas le droit

un grand merci pour votre aide

will
dannw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 21h20   #6
Invité de passage
 
Inscription : juillet 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 9
Points : 1
Points : 1
Par défaut petit erreur

dans la table client
j ai session comme grant

GRANT INSERT ON TABLE client TO inser_cl WITH GRANT OPTION;

et non

GRANT INSERT ON TABLE client TO insert_client_groupe WITH GRANT OPTION;

merci
dannw 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 09h28.


 
 
 
 
Partenaires

Hébergement Web