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

Oracle Discussion :

COLLECTION + FORALL


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Août 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 13
    Par défaut COLLECTION + FORALL
    Bonjour tout le monde,

    J'ai une collection refletant l'image d'une table MyTable, (contenant plus de 300 colonnes toutes aux noms très longs et composé).

    ci-dessous 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
    ....
    ....
    TYPE TypeOfMyCollection IS TABLE OF My_Table%ROWTYPE INDEX BY PLS_INTEGER ;
    MyCollection TypeOfMyCollection ;
    ....
    ....
    BEGIN
    ....
    -- Là, je remplit ma collection jusqu'à un niveau N
    ....
    ....
    -- Ici je veux passer mes data de ma collection vers ma table
    FORALL MyIndex IN MyCollection.FIRST .. MyCollection.LAST
    INSERT INTO MyTable VALUES ???????? ; -- Si possible d'utiliser une seule fois ma collection et non pas lister toutes les colonnes (NBR>300) préfixées par le nom de ma collection.
    ....
    ....
    END;
    /
    Merci d'avance pour vos réponses.

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    A partir d'oracle9i, les copies d'informations par blocs peuvent être effectuées directement dans les collections d'enregistrements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Forall i in tabrec.first..tabrec.last
            insert into TEST values tabrec(i) ;
    voir le chapitre 5 du Guide PL/SQL

    http://sheikyerbouti.developpez.com/...age=Chap5#L5.4

  3. #3
    Membre averti
    Inscrit en
    Août 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 13
    Par défaut
    Merci pour la réponse.

    Pour ma version d'ORACLE : sous SQL*Plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IREF - BOMBARDIER > select * from v$version ;
     
    BANNER
    ----------------------------------------------------------------
    Oracle9i Enterprise Edition Release 9.2.0.3.0 - 64bit Production
    PL/SQL Release 9.2.0.3.0 - Production
    CORE    9.2.0.3.0       Production
    TNS for IBM/AIX RISC System/6000: Version 9.2.0.3.0 - Production
    NLSRTL Version 9.2.0.3.0 - Production

    Avec ça j'ai une erreur de compilation :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Erreurs pour PROCEDURE P_PROTECT_C :
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    7691/7    PL/SQL: SQL Statement ignored
    7691/19   PL/SQL: ORA-00947: Nombre de valeurs insuffisant
    Je précise que contrairement à l'exemple que tu donnes dans ton cours (que j'apprécis énormément), je ne suis pas passé par le BULK, nécessité l'oblige, je remplit ma collection via plusieurs étapes. Peut-être ça la source d'erreur ??!!

    Merci par avance.

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Il apparait, au travers du message d'erreur, que les colonnes de la collection ne correspondent pas, au moins en nombre, à celle de la table en insertion

  5. #5
    Membre averti
    Inscrit en
    Août 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 13
    Par défaut
    Merci SheikYerbouti pour la réponse

    Sauf que la collection est déclarée en %ROWTYPE, et donc, en nombre cela devrait marcher !

    Je mentionne bien en haut dans le code que ma collection est indexée (PLS_INTEGER) et donc n'est pas NESTED TABLE,
    D'autres parts, je ne passe pas par le BULK COLLECT INTO MyCollection pour l'alimenter, non, je l'alimente autrement ligne par ligne,....etc.

    Est-ce que le FORALL doit être accompagnée par le BULK,... (doit opérer sur une collection alimentée par BULK).

    Merci encore.

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Non, il n'y a aucun rapport. FORALL fonctionne sur des collections qui peuvent être alimentées soit par un select soit à la mano.

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    SQL> select * from v$version ;
     
    BANNER
    ----------------------------------------------------------------
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    PL/SQL Release 9.2.0.5.0 - Production
    CORE    9.2.0.6.0       Production
    TNS for Solaris: Version 9.2.0.5.0 - Production
    NLSRTL Version 9.2.0.5.0 - Production
     
    SQL> 
    SQL> desc messages;
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     CODE                                      NOT NULL NUMBER(5)
     TEXTE                                     NOT NULL VARCHAR2(256)
     TITRE                                              VARCHAR2(100)
     STOP                                      NOT NULL VARCHAR2(1)
     ALERTE                                             VARCHAR2(15)
     
    SQL>  create table messages2 as select * from messages where 1=2 ;
     
    Table créée.
     
    SQL> desc messages2 ;
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     CODE                                      NOT NULL NUMBER(5)
     TEXTE                                     NOT NULL VARCHAR2(256)
     TITRE                                              VARCHAR2(100)
     STOP                                      NOT NULL VARCHAR2(1)
     ALERTE                                             VARCHAR2(15)
     
    SQL> 
    SQL> declare
      2    type TYP_REC is table of messages%rowtype index by binary_integer;
      3    tableau TYP_REC ;
      4  begin
      5    tableau(1).code := 101;
      6    tableau(1).texte := 'texte1';
      7    tableau(1).titre := 'titre1';
      8    tableau(1).stop := 'O';
      9    tableau(1).alerte := 'erreur';
     10    tableau(2).code := 102;
     11    tableau(2).texte := 'texte2';
     12    tableau(2).titre := 'titre2';
     13    tableau(2).stop := 'O';
     14    tableau(2).alerte := 'erreur';       
     15    FORALL i IN tableau.first..tableau.last 
     16       INSERT INTO messages2 values tableau(i) ;
     17  end;
     18  /
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> SQL> select * from messages2 ;
     
          CODE
    ----------
    TEXTE
    --------------------------------------------------------------------------------
    TITRE
    --------------------------------------------------------------------------------
    S ALERTE
    - ---------------
           101
    texte1
    titre1
    O erreur
     
     
          CODE
    ----------
    TEXTE
    --------------------------------------------------------------------------------
    TITRE
    --------------------------------------------------------------------------------
    S ALERTE
    - ---------------
           102
    texte2
    titre2
    O erreur
     
     
    SQL>
    aucun problème.

  8. #8
    Membre averti
    Inscrit en
    Août 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 13
    Par défaut
    Merci SheikYerbouti pour tes réponses et ton aide très précieuse.

    Cependant, je vais voir, ailleurs dans le code pourquoi ça ne marche pas, j'appliquerai aussi l'exemple donné sur ma base.

    D'ici là c'est un sujet résolu.

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

Discussions similaires

  1. erreur bulk collect et forall
    Par donny dans le forum PL/SQL
    Réponses: 2
    Dernier message: 03/08/2009, 15h33
  2. Bug PL/SQL ? (forall, bulk collect into)
    Par wondersonic dans le forum PL/SQL
    Réponses: 4
    Dernier message: 06/02/2008, 12h05
  3. [10] forall et les collection de record
    Par noinneh dans le forum Oracle
    Réponses: 3
    Dernier message: 13/02/2006, 13h49
  4. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

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