IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Boucler via un Record


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur TIC
    Inscrit en
    Mars 2010
    Messages
    93
    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 : 93
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    -----------------
    ______________________________________________________________
    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 Images attachées   

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Et pourquoi ne pas faire plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    ...

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur TIC
    Inscrit en
    Mars 2010
    Messages
    93
    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 : 93
    Par défaut
    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.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    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.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur TIC
    Inscrit en
    Mars 2010
    Messages
    93
    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 : 93
    Par défaut
    'consommer plus de mémoire et d'aller moins vite', je vois pas trop ce que vous voulez dire.Merci

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    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.

Discussions similaires

  1. [JSTL] Boucler via index
    Par lequebecois79 dans le forum Taglibs
    Réponses: 0
    Dernier message: 12/12/2011, 23h30
  2. [AC-2007] Recherche d'enregistrements/records via plusieurs mots entiers
    Par Cinesra dans le forum VBA Access
    Réponses: 18
    Dernier message: 17/11/2010, 15h21
  3. [Kylix] PostgreSql via ODBC
    Par doykati dans le forum EDI
    Réponses: 3
    Dernier message: 08/02/2007, 10h10
  4. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo