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 14/09/2006, 11h07   #1
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Par défaut Aide requête sql

Bonjour,

Voici ma petite requête :
$body$
DECLARE
nb_lignes BIGINT;
BEGIN
SELECT COUNT(membre_maj_id) INTO nb_lignes
FROM membre_maj
WHERE membre_maj_membre_id = $1
AND membre_maj_membre_id_crypte = $2;
IF nb_lignes=1 THEN
/* instructions update*/
ELSE
/* instructions insert */
END IF
RETURN ;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;[/CODE]

j'ai fait un type pour retourner nb_lignes mais je n'arrive pas à récupérer cette valeur de nb_lignes???

Une petite aide serait appréciable

Merci

Merci
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 18h42   #2
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
En fait l'affectation a une variable ce fait comme ca :
SELECT INTO variable1,variable2 5,99

ainsi pour ta requete :

Code :
1
2
3
4
SELECT INTO nb_lignes COUNT(membre_maj_id)
FROM membre_maj
WHERE membre_maj_membre_id = $1
AND membre_maj_membre_id_crypte = $2;
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 19h28   #3
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
ah bon ?

J'ai déjà fait ça : SELECT COUNT(membre_maj_id) INTO nb_lignes dans des requêtes et ça marche très bien...
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 19h34   #4
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Oui sûr,

En plPgSQL c'est bien cette syntaxe

Le SELECT .... INTO ..... FROM ... est pour creer directement une table venant d'un jeu d'enregistrement.
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 19h36   #5
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Je te crois mais pourquoi ça fonctionne alors ? Oui j''ai lu que c'est assez laxiste et le INTO placé comme le mien fonctionne aussi.

Quoiqu'il en soit ce n'est pas du à cela que je n'arrive pas à récupérer la variable nb_lignes en retour de la requête enfin je ne pense pas
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 20h07   #6
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Effectivement j'ai vu sur certains sites qu'il y avait ta notation, personnelement je ne l'avais jamais utilisé.

Peux tu faire l'essai avec l'autre methode ?

Et il y a un autre truc que je viens de voir

Code :
1
2
3
4
5
IF nb_lignes=1 THEN
/* instructions update*/
ELSE
/* instructions insert */
END IF
Ce ne serait pas plutot

Code :
1
2
3
4
5
IF nb_lignes!=0 THEN
/* instructions update*/
ELSE
/* instructions insert */
END IF
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 20h10   #7
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
oui ça fonctionne avec l'autre syntaxe je viens d'essayer

par contre quelle est la différence entre ce que tu me dis et ce que j'ai fait ? dans les deux cas ça fonctionne .

Oui je vois pourquoi tu me demandes cela mais count ne sera jamais supérieur à 1
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 20h17   #8
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Citation:
mais count ne sera jamais supérieur à 1
en theorie mais on sait jamais....
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 20h20   #9
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
ben si count = 3 alors la requete a foirée à un moment et ça craint pour postgresql quand même

Enfin je n'ai toujours pas résolu mon problème comment retourner une valeur d'une variable en l'occurence ici nb_lignes car j'ai besoin de cette valeur dans mon script php.
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 20h51   #10
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Citation:
si count = 3 alors la requete a foirée à un moment et ça craint pour postgresql quand même
Remarque tres juste
Pour recup dans ta fonction
Tu declare ta procedure avec un type renvoyé int4, et que tu met return nb_lignes :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$body$
DECLARE
nb_lignes BIGINT;
BEGIN
SELECT INTO nb_lignes
 COUNT(membre_maj_id) FROM membre_maj
WHERE membre_maj_membre_id = $1
AND membre_maj_membre_id_crypte = $2;
IF nb_lignes=1 THEN
/* instructions update*/
ELSE
/* instructions insert */
END IF
RETURN nb_lignes;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 20h56   #11
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
pourquoi pas un type renvoyé bigint comme nb_lignes ?
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h03   #12
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Comme tu veux, arrivera tu a la limite du INT ?

Pour rappel :

INT
les entiers signés : de -2 147 483 648 à 2 147 483 647.
les entiers non-signés : de 0 à 4 294 967 295.

BIGINT
les entiers signés : de -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807. les entiers non-signés : de 0 à 18 446 744 073 709 551 615.
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h04   #13
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Ok super ça fonctionne ! merci !!!

juste une dernière question, je passe ce week end de la version 8.0.3 à la 8.1.4 as-tu un conseil à me donner ou tout devrait se passer nickel ?
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h12   #14
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
au fait si je dois retourner plusieurs variables je peux mettre RETURN var 1, var 2, var 3 et créer un type pour ce retour ?
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h21   #15
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
le return ne renvoi qu'une valeur/variable
mais il y a une parade, creer un type composite
Code :
1
2
3
4
5
 
CREATE TYPE montype AS
   (val1 int2,
    val2 varchar,
    val3 int4);
pour affecter

Code :
1
2
3
4
5
6
7
8
DECLARE
 mavar montype;
BEGIN
 mavar.val1:=56;
 mavar.val2:='hpalpha';
 mavar.val3:=65;
 RETURN mavar;
END;
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h24   #16
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
alors là j'ai appris quelque chose ! merci !!!!!
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h28   #17
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
mais je dois quand même déclarer ma procédure avec un type renvoyé ?
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h29   #18
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
oui change le type de retour par ton nouveau type
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2006, 21h31   #19
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
ok ben grand merci j'ai progressé ce soir !!!!
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h00.


 
 
 
 
Partenaires

Hébergement Web