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 12/04/2011, 18h15   #1
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Par défaut Boucler via un Record

Bonjour,

en cours de mon stage je suis amené à réaliser des procédures stockées via postgreSQL 8.4, et ce pour une performance d'appel des requettes en terme de temps d’exécution, dans le script que je vous expose, j'ai du pour réduire le temps d'execution stocker le résultat d'un select dans un Record afin de boucler avec au lieu de l'utiliser directement au niveau de la boucle , chose qui me retourne l'erreur en dessous :calim2 :, quand j'appelle ma fonction au niveau de la console:

script:
------
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DROP FUNCTION deleteuser(integer);
CREATE OR REPLACE FUNCTION deleteuser(userid integer) RETURNS integer AS $BODY$
DECLARE
i integer;
tab record;
BEGIN
UPDATE billing_user SET deleted=true WHERE id_user=userid;
SELECT INTO tab id_user FROM billing_reseller WHERE id_super_user=userid;
FOR i IN SELECT tab LOOP
PERFORM deleteuser(i);
END LOOP;
RETURN 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "deleteuser"(integer) OWNER TO postgres;
Requêttes d'appel:
------------------
SELECT deleteuser(2);


Erruer retournée:
-----------------
Citation:
______________________________________________________________
ERREUR: syntaxe en entrée invalide pour l'entier : « (4) »
CONTEXT: PL/pgSQL function "deleteuser" line 7 at FOR sur des lignes de SELECT

********** Erreur **********

ERREUR: syntaxe en entrée invalide pour l'entier : « (4) »
État SQL :22P02
Contexte : PL/pgSQL function "deleteuser" line 7 at FOR sur des lignes de SELECT
______________________________________________________________
vous trouverez ci-joint les images correspondant aux tables, je serais très reconnaissant pour tout aide, car je suis affreusement coincé.
Images attachées
Type de fichier : png billing_user.png (3,4 Ko, 0 affichages)
Type de fichier : png billing_reseller.png (7,3 Ko, 0 affichages)
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 13h15   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Et pourquoi ne pas faire plus simplement:
Code :
1
2
3
4
5
6
 
...
FOR i IN SELECT id_user FROM billing_reseller WHERE id_super_user=userid LOOP
PERFORM deleteuser(i);
END LOOP;
...
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h52   #3
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Bonjour,

Merci pour votre réponse estofilo, je ne veux pas faire de la sorte parce que ca consomme déjà en temps d'exécution et en pile du SGBD(Recursivité), et imaginez combien ca va encore consommer l'exécution du select pour chaque itération de la boucle, parce que par la suite je serais amené à gérer des tables qui peuvent contenir plus que 1000 lignes, dont le temps d'exécution et pour moi un élément très primordiale. c'est pour ca qui j'ai pensé à enregistrer le résultat du select dans un record en premier temps et boucler avec par la suite , mais ca a donnée ce que j'avais décrit dans mon premier message.

Excellente journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 12h14   #4
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Au lieu de faire un seul SELECT tu en fais deux et avec un passage de variable entre les deux. Je ne vois pas ce qui te fais espérer que ça va aller plus vite. Si ça fait une différence notable ce qui déjà est à voir, ça sera plutôt dans le sens de consommer plus de mémoire et d'aller moins vite.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 12h43   #5
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
'consommer plus de mémoire et d'aller moins vite', je vois pas trop ce que vous voulez dire.Merci
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 13h51   #6
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Citation:
Envoyé par ratata Voir le message
'consommer plus de mémoire et d'aller moins vite', je vois pas trop ce que vous voulez dire.Merci
Remplir une zone de mémoire temporaire avec des données consomme plus de mémoire que de ne pas le faire.
estofilo 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 03h02.


 
 
 
 
Partenaires

Hébergement Web