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 :

CURSOR and BULK COLLECT


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Par défaut CURSOR and BULK COLLECT
    Bonjour à tous,

    j'essaye d'écrire une procédure Oracle qui doit réaliser un traitement sur une table contenant 400 000 enregsitrements.

    Je réalise un curseur et je parcours ce curseur tous les 200 en les stockant dans une table temporaire grâce au BULK COLLECT.

    Quand je lance la procédure , elle tourne et rien ne se passe.


    A votre avis quelle est la meilleure façon de traiter cette problématique ?


    Merci à tous

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Faire du debug, non ?!
    Pourquoi voulez-vous mettre les enregistrements dans une table temporaire ?

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Par défaut
    ben je vois pas comment faire autrement pour aller vite ..... en PL/SQL

    voici le code


    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
     
     
    PROCEDURE UPDATE_TABLE1_CHAMP2
    IS
     
       TYPE    TYP_TAB_TABLE1 IS TABLE OF TABLE1%ROWTYPE INDEX BY PLS_INTEGER;
       TEMP_TABLE1 TYP_TAB_TABLE1 ;
       Cursor  C_TABLE1 is Select * From TABLE1  order by CHAMP1,rowid ASC; 
       cpt Pls_integer :=1;
       prec TABLE1.CHAMP1%TYPE :='';
     
    Begin
     
     
         OPEN C_TABLE1;
         LOOP
            FETCH C_TABLE1 BULK COLLECT into TEMP_TABLE1 LIMIT 200;
     
            FOR i In 1..TEMP_TABLE1.Count loop
              dbms_output.put_line('Traitement : CHAMP1=' || TO_CHAR(TEMP_TABLE1(i).CHAMP1));
              update TABLE1 set CHAMP2=TO_CHAR(cpt) where ID_TABLE1=TEMP_TABLE1(i).ID_TABLE1;
              cpt:=cpt+1;
              if (prec <> '') and (prec <>TEMP_TABLE1(i).CHAMP1 ) then
                cpt:=1;
              end if;
              prec := TEMP_TABLE1(i).CHAMP1 ;
            end loop;
            exit when C_TABLE1%notfound;
     
         END LOOP ;
         CLOSE C_TABLE1;
     
     
     
    EXCEPTION
        WHEN OTHERS then  dbms_output.put_line(TO_CHAR(sqlerrm));
     
    END UPDATE_TABLE1_CHAMP2;

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Vous ne maitrisez pas le traitement via Bulk (votre condition de sortie de boucle est incorrecte). Voilà un exemple (faite set server output sous sqlplus on avant de l'exécuter)
    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
    46
    47
    48
    49
     
    Declare
      cBatchsize  constant Pls_Integer := 3;
      Type rEmployee Is Record (
        employee_id     employees.employee_id%Type,
        first_name      employees.first_name%Type,
        last_name       employees.last_name%Type,
        email           employees.email%Type,
        phone_number    employees.phone_number%Type,
        hire_date       employees.hire_date%Type,
        job_id          employees.job_id%Type,
        salary          employees.salary%Type,
        commission_pct  employees.commission_pct%Type,
        manager_id      employees.manager_id%Type,
        department_id   employees.department_id%Type
      );
      Type Employee_va  Is Varray(1000) Of rEmployee;  
      l_Employees          Employee_va;
      --  
      Cursor CrsEmployee(department_id  employees.department_id%Type) Return employees%Rowtype Is
        Select t.employee_id, 
               t.first_name, 
               t.last_name, 
               t.email, 
               t.phone_number, 
               t.hire_date, 
               t.job_id, 
               t.salary, 
               t.commission_pct, 
               t.manager_id, 
               t.department_id
          From hr.employees t
         Where t.department_id = CrsEmployee.department_id;      
    Begin
      Open CrsEmployee(60);
      --    
      Loop
        Fetch CrsEmployee Bulk Collect Into l_Employees Limit cBatchsize;
        --
        For i In 1..l_Employees.Count 
        Loop
          Dbms_Output.Put_Line(l_Employees(i).employee_id);
        End Loop;
        --
        Exit When l_Employees.Count() < cBatchsize;
      End Loop;
      --
      Close CrsEmployee;
    End;
    PS. Supprimez les gestionnaire d'exception, il ne sert qu'à vous poser des problèmes.

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Par défaut
    OK mais dans mon cas mon cursor CrsEmployee contiendra 400000 enregistrements ! car c'est ma table au complet ...

    Je vais refaire des tests en set server output ...

    merci

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Un curseur ne "contiendra" jamais les enregistrements de la table.

+ 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. BULK COLLECT ==> TYPE TABLE OF (Cursor Rowtype)
    Par argoet dans le forum Oracle
    Réponses: 5
    Dernier message: 17/05/2005, 16h47
  3. [Forms6i] Pb avec BULK COLLECT
    Par Kast dans le forum Forms
    Réponses: 3
    Dernier message: 27/12/2004, 16h55
  4. BULK COLLECT
    Par ghostlord79 dans le forum SQL
    Réponses: 3
    Dernier message: 06/08/2004, 13h42
  5. failed BULK COLLECT
    Par patmaba dans le forum SQL
    Réponses: 7
    Dernier message: 01/06/2004, 12h03

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