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

PL/SQL Oracle Discussion :

Utilisation de 'BULK COLLECT INTO' dans un curseur [11gR2]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut Utilisation de 'BULK COLLECT INTO' dans un curseur
    Bonjour à tous,

    Récemment je suis revenu sur une fonction que j'avais développé en pl/sql pour utilisation dans un outil de reporting.
    Cette fonction me permettait de retourner un jeu de données en fonction de 2 dates.
    Dans la fonction j'utilise bulk collect into pour alimenter une variable de type table au sein d'un curseur.
    Cela fonctionnait trés bien auparavant, et la version d'oracle n'a pas changé entre la dernière fois où j'ai utilisé cette fonction et aujourd'hui.
    La fonction en question me renvoyait un jeu de données complet en fonction de chaque valeur du curseur, alors qu'à présent elle me renvoie uniquement le dernier jeud de données correspondant à la dernière valeur de mon curseur.
    En résumé, chaque itération dans mon curseur écrase le contenu de ma variable table.
    En épluchant quelques forums, tout le monde s'accorde à dire que c'est normal et que cela correspond au fonctionnemnt normal.. Sauf que je suis absolument certain que cela fonctionnait tel quel avant, et que les données étaient bien ajoutées dans ma variable table.
    Est-ce qu'il existe un paramètre global au niveau d'Oracle qui permet de modifier le comportement par défaut de 'bulk collect into', qui aurait été activé auparavant ?

    Merci d'avance pour votre aide!

    droog

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    On n'a pas le détail de votre code, mais un SELECT ... BULK COLLECT va effectivement "remettre à zéro" la collection avant de l'alimenter.

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut
    Merci pour la réponse
    je voulais d'abord exposer en résumé mon problème.
    Pour le code, voici la fonction qui prend en paramètre mes 2 dates, et dont le but est de créer un curseur sur des heures arrondies au quart d'heure, qui permet ensuite de sommer un nombre de personnes sur chaque quart d'heures, regroupées en fonction de données précises :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    function ft_quartsaffect (p_datedeb varchar2,p_datefin varchar2) return t_quarts_table as
     
    	qtable t_quarts_table;
    	qcoll t_quarts_col;
    	v_datdeb varchar2(10);
    	v_datfin varchar2(10);
     
    	cursor c_quarts  is
    	   select hdebq from 
    	   (select to_char(trunc(to_date(hdeb,'hh24mi'),'HH')+(15*floor(to_char( trunc(to_date(hdeb,'hh24mi'),'MI'),'MI')/15))/1440,'hh24mi') hdebq 
    	   from plpacti
    	   where dat between v_datdeb and v_datfin
    	   )
    		group by hdebq order by hdebq;     
    	r_quarts c_quarts%ROWTYPE;
     
     
    begin
     
      v_datdeb := to_char(to_date(p_datedeb,'YYYYMMDD'),'DD/MM/YYYY');
      v_datfin := to_char(to_date(p_datefin,'YYYYMMDD'),'DD/MM/YYYY');
      qtable := t_quarts_table();
     
      Open c_quarts;
      loop
      fetch c_quarts into r_quarts;
      exit when c_quarts%notfound;
     
        -- Utilisation de Bulk Collect pour alimenter la table retournée par la fonction
        select t_quarts_col(dat , r_quarts.hdebq , codelieu , codequal , count(matri))
        bulk collect into qtable
           from plpacti 
           where ((r_quarts.hdebq between hdeb and hfin) and (r_quarts.hdebq+14 between hdeb and hfin)) and codequal <> ' ' 
           and dat between v_datdeb and v_datfin
           group by dat, codelieu, codequal
           order by dat,r_quarts.hdebq;
     
      end loop;
      close c_quarts;
     
    return qtable;
     
    end;
    /
    Avant la contenu de la table renvoyée par la fonction, correspondait à chaque quart d'heure.
    Depuis que je l'ai reprise, seul les données correspondant au dernier quart d'heure me sont renvoyées...

    Ce que j'aimerai comprendre c'est pourquoi cela fonctionnait avant...


    Merci d'avance


    droog

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut
    Bonjour,

    Bon finalement j'ai réglé mon problème, en effectuant une jointure entre ma requête alimentant ma variable de type table, et la requête de mon curseur...
    Cela me permet d'alimenter la variable table en une seule fois.
    Ca m'embête quand même de ne pas comprendre pourquoi cela fonctionnait avant. Je trouvais l'écriture plus logique auparavant, et mes données s'ajoutaient bien à chaque itération de mon curseur.
    Mystère..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [10gR2] BULK COLLECT - CURSOR dans %TYPE %ROWTYPE
    Par noisettes38 dans le forum PL/SQL
    Réponses: 7
    Dernier message: 16/07/2014, 23h17
  2. Returning bulk collect into dans du sql dynamique
    Par puck78 dans le forum PL/SQL
    Réponses: 7
    Dernier message: 19/01/2009, 19h29
  3. Bug PL/SQL ? (forall, bulk collect into)
    Par wondersonic dans le forum PL/SQL
    Réponses: 4
    Dernier message: 06/02/2008, 12h05
  4. [9i] Performances du BULK COLLECT INTO ?
    Par AyaGizmo dans le forum SQL
    Réponses: 6
    Dernier message: 18/10/2007, 17h20
  5. 8i bulk collect into
    Par Ujitsu dans le forum SQL
    Réponses: 3
    Dernier message: 11/10/2007, 16h32

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