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 :

Copie d'une table à une autre.


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut Copie d'une table à une autre.
    Bonjour,

    Je dois copier plusieurs lignes de la table A vers la table B. Dans l'absolue, il n'y a pas de problème. Sauf que la table A peut contenir plus de 5 Millions de lignes, et lors de l'INSERT, j'explose le RollBack Segment. Je cherche un moyen efficace de découper le traitement en plusieurs parties. De plus, une fois les données copiées de A vers B, je dois faire un delete sur A pour effacer les lignes copiées. Et là aussi, je fais exploser le RollBack Segment.
    Je précise que je suis novice en PL/SQL, j'ai commencé il y a moins d'un mois.

    Merci pour votre aide.

    Cordialement,

    Caillou.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    recherche BULK COLLECT

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut
    Bonjour,

    Merci pour votre aide.
    Suite à votre premier message, j'ai aussi trouvé une explication à l'adresse suivante : http://www.developpez.net/forums/d63...ion-procedure/ .
    Cette solution à l'air la plus simple à mettre en place et semble très pratique.

    Merci

    Cordialement,

    Caillou

  5. #5
    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
    Citation Envoyé par Caillou63 Voir le message
    Bonjour,

    Merci pour votre aide.
    Suite à votre premier message, j'ai aussi trouvé une explication à l'adresse suivante : http://www.developpez.net/forums/d63...ion-procedure/ .
    Cette solution à l'air la plus simple à mettre en place et semble très pratique.

    Merci

    Cordialement,

    Caillou
    Le plus simple est d’allouer assez d’espace de rollback que nécessaire. Si toute fois cela s’avère impossible le problème qui se pose est comment redémarrer le traitement en cas de plantage vu que des commits intermédiaires ont été effectués. Le bulk collect n’est que une méthode pour réduire la durée du traitement.

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est sûr qu'en employant cette méthode il faut tracer ce qui est fait pour faire une reprise en cas d'erreur

  7. #7
    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
    Citation Envoyé par orafrance Voir le message
    c'est sûr qu'en employant cette méthode il faut tracer ce qui est fait pour faire une reprise en cas d'erreur
    Et voilà comment cette solution qui "a l'air la plus simple à mettre en place" devient légèrement plus compliqué en pratique.

  8. #8
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    enfin, même à voir ça parait pas plus simple je trouve

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut
    Bonjour,

    J'ai oublié de poser une petite question : est ce que cette commande peut être utilisée en oracle 8i??
    J'ai cherché plusieurs tutos et à chaque fois la version 9i et supérieur est utilisée.
    De plus, vu que la table contient à la louche 5 000 000 de lignes et plus, donc la durée du traitement........ on en peut pas aller plus vite que la musique.

    Cordialement,

    Caillou.

  10. #10
    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
    Oui

    [EDIT]
    ...
    De plus, vu que la table contient à la louche 5 000 000 de lignes et plus, donc la durée du traitement........ on en peut pas aller plus vite que la musique.
    Plus vite non, on ne peut pas. Par contre moins vite ...

    [/EDIT]

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Par contre l'utilisation des collections est plus pénible à coder en 8i.
    Je crois que tu es obligé d'avoir une collection par colonne selectionnée, et pas des collections de records ou autres.

  12. #12
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    surtout, le bulk collect vient de la 9i il me semble non ? Il risque de devoir faire du ligne à ligne avec commit de temps en temps

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Non pas de soucis pour le bulk collect, par contre (étant l'heureux propriétaire d'une 8i ) je viens de retester et je confirme ce que je disais, c'est plus chiant à coder.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    SQL> declare
      2
      3  type t_table is table of t%rowtype index by binary_integer;
      4  type t_c is table of t.c%type index by binary_integer;
      5  type t_d is table of t.d%type index by binary_integer;
      6
      7  macol t_table;
      8  macol1 t_c;
      9  macol2 t_d;
     10
     11  cursor cur1 is select c,d from t;
     12
     13  begin
     14    open cur1;
     15     loop
     16     fetch cur1 BULK COLLECT into macol1,macol2;
     17     Exit When cur1%NOTFOUND ;
     18    end loop;
     19    close cur1;
     
     20   21    for i in macol1.first..macol1.last loop
     22        dbms_output.put_line(macol1(i)||' - '||macol2(i));
     23    end loop;
     24
     25  end;
     26  /
    28/10/08 - 29/10/08
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> declare
      2
      3  type t_table is table of t%rowtype index by binary_integer;
      4  type t_c is table of t.c%type index by binary_integer;
      5  type t_d is table of t.d%type index by binary_integer;
     
    macol t_table;
    macol1 t_c;
    macol2 t_d;
      6    7    8    9   10
     11  cursor cur1 is select c,d from t;
     12
     13  begin
      open cur1;
     14   15     loop
     16     fetch cur1 BULK COLLECT into macol;
     17     Exit When cur1%NOTFOUND ;
     18    end loop;
      close cur1;
     19   20
     21    for i in macol.first..macol.last loop
     22        dbms_output.put_line(macol(i).c||' - '||macol(i).d);
     23    end loop;
     24
     25  end;
     26  /
       fetch cur1 BULK COLLECT into macol;
                                    *
    ERREUR à la ligne 16 :
    ORA-06550: Ligne 16, colonne 33 :
    PLS-00597: l'expression 'MACOL' dans la liste INTO est de type incorrect
    ORA-06550: Ligne 16, colonne 4 :
    PL/SQL: SQL Statement ignored

  14. #14
    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
    Citation Envoyé par skuatamad Voir le message
    Non pas de soucis pour le bulk collect, par contre (étant l'heureux propriétaire d'une 8i ) je viens de retester et je confirme ce que je disais, c'est plus chiant à coder.
    ...
    Tu peux utiliser un type objet pour contourner ce problème.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut
    Bonjour,

    Merci pour toutes ces explications. Je vais quand même prendre le Bulk Collect. C'est peut etre un peu long à coder mais ce sera le plus simple à dégogger si TMA il y a.

    Cordialement,

    Caillou

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 82
    Par défaut
    Bonjour,

    Après avoir mis en place la solution proposée, j'obtient l'erreur suivante :
    -4030: ORA-04030: out of process memory when trying to allocate 16396 bytes (koh-kghu sessi,kolcalm coll).
    Que puis je faire pour ne plus avoir cette erreur??

    Cordialement,

    Caillou

  17. #17
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut mnitu,
    Citation Envoyé par mnitu Voir le message
    Tu peux utiliser un type objet pour contourner ce problème.
    Bon au début je me suis dis super, mais en fait j'ai pas trop réussi avec le type object :
    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
    SQL> create table t as select sysdate c1, sysdate+1 c2 from dual;
     
    Table créée.
     
    SQL> CREATE OR REPLACE
    TYPE TYP_OBJ AS OBJECT (c1 date, c2 date);  2
      3  /
     
    Type créé.
     
    SQL> CREATE OR REPLACE
    TYPE TYP_TAB_OBJ AS TABLE OF TYP_OBJ ;
    /  2    3
     
    Type créé.
     
    SQL> declare
      2  macol TYP_TAB_OBJ;
      3  cursor cur1 IS SELECT c1,c2 FROM t;
      4  begin
      5    open cur1;
      6    loop
      7        fetch cur1 BULK COLLECT INTO macol;
      8        Exit When cur1%NOTFOUND ;
      9    end loop;
     10    close cur1;
     11    FOR i IN macol.first..macol.last loop
     12        dbms_output.put_line(macol(i).c1||' - '||macol(i).c2);
     13    end loop;
     14  end;
     15  /
          fetch cur1 BULK COLLECT INTO macol;
                                       *
    ERREUR à la ligne 7 :
    ORA-06550: Ligne 7, colonne 36 :
    PLS-00386: non-concordance de type à 'MACOL' entre curseur FETCH et variables
    INTO
    ORA-06550: Ligne 7, colonne 7 :
    PL/SQL: SQL Statement ignored
    J'ai quand même fini par faire une petite recherche sur PLS-00386 et à priori on ne peut pas bulk collect dans un object (même en 9i):
    http://www.developpez.net/forums/d11...ction-dobjets/

  18. #18
    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
    Citation Envoyé par skuatamad Voir le message
    Salut mnitu,

    Bon au début je me suis dis super, mais en fait j'ai pas trop réussi avec le type object :
    ...
    J'ai quand même fini par faire une petite recherche sur PLS-00386 et à priori on ne peut pas bulk collect dans un object (même en 9i):
    http://www.developpez.net/forums/d11...ction-dobjets/
    Si si ça marche mais il y a un astuce
    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
     
    CREATE TABLE t AS SELECT sysdate c1, sysdate+1 c2 FROM dual
    /
    CREATE OR REPLACE TYPE TYP_OBJ AS OBJECT (c1 date, c2 date)  
    /
    CREATE OR REPLACE TYPE TYP_TAB_OBJ AS TABLE OF TYP_OBJ
    /
    declare
      macol TYP_TAB_OBJ;
      cursor cur1 IS SELECT typ_obj(c1,c2) FROM t;
    begin
      open cur1;
      macol := TYP_TAB_OBJ();
      loop
        fetch cur1 BULK COLLECT INTO macol limit 5;
        --   
        FOR i IN macol.first..macol.last loop
          dbms_output.put_line(macol(i).c1||' - '||macol(i).c2);
        end loop;
        --
        Exit When cur1%NOTFOUND;
      end loop;
      close cur1;
    end;
    /

  19. #19
    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
    Citation Envoyé par Caillou63 Voir le message
    Bonjour,

    Après avoir mis en place la solution proposée, j'obtient l'erreur suivante :
    -4030: ORA-04030: out of process memory when trying to allocate 16396 bytes (koh-kghu sessi,kolcalm coll).
    Que puis je faire pour ne plus avoir cette erreur??

    Cordialement,

    Caillou
    Et t'as utilisé LIMIT ?

  20. #20
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    yes merci mnitu pour l'astuce

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Copie de données d'une table à une autre
    Par Britney_Spears dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 28/06/2013, 11h49
  2. Copie de données d'une table à une autre
    Par Jacques Bellavance dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/04/2008, 16h33
  3. Copie d'une table à une autre
    Par afrodje dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/02/2008, 11h34
  4. Copie de données d'une table à l'autre
    Par ganga dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/11/2006, 08h34
  5. Copie d'une table à une autre
    Par papipasto dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/03/2006, 17h02

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