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 :

[PL/SQL] Bulk binds


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 27
    Points
    27
    Par défaut [PL/SQL] Bulk binds
    Bonjour,

    Je viens de découvrir la possibilité de remplir une table PL/SQL avec le résultat d'un SELECT en utilisant BULK COLLECT. La doc précise que c'est censé être une méthode assez efficace.

    L'ennui, c'est qu'un tel SELECT remplace toutes les valeurs de la table. Existe-t-il un moyen de concaténer les résultats de plusieurs SELECT en une seule table PL/SQL tout en gardant le principes de BULK BINDS?

    Merci d'avance,
    Pierre

  2. #2
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Je ne comprends pas bien votre question. Pouvez-vous donner un exemple et également indiquer la version utilisée.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Dans l'article Bulk Binds and Record Processing in Oracle9i Release 2, on peut trouver le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
      TYPE test1_tab IS TABLE OF test1%ROWTYPE;
     
      t_tab  test1_tab := test1_tab();
    BEGIN
      SELECT id, description
      BULK COLLECT INTO t_tab
      FROM test1;
    END;
    /
     
    PL/SQL procedure successfully completed.
     
    Elapsed: 00:00:00.00
    Où test1 est une table SQL normale.

    Imaginons maintenant une table test2 avec des colonnes de type identique à celles de test1. Je voudrais, de la même façon, insérer le contenu de test2 dans t_tab. Le problème (pour l'avoir essayé), c'est que le deuxième select into (celui test2) remplace complètement les valeurs de obtenues de la table test1.

    J'aurais préféré une instruction qui fasse une insertion plutôt qu'un remplacement total.

    J'imagine qu'il est facile d'envisager la création de trois tables PL/SQL t_tab1, t_tab2 et t_tab :
    - t_tab1 = résultat d'un select sur test1,
    - t_tab2 = résultat d'un select sur test2,
    - t_tab = union des deux tables à l'aide de boucles FOR.
    C'est juste moins compact.

  4. #4
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Pourquoi ne faites-vous pas l'union dès le Select ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select * from table 1
    Union all
    Select * from table 2
    Into ...
    Bulk collect
    ...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Merci, j'essaierai ça dès lundi.
    J'avais cru naïvement que la syntaxe avec bulk collect était plus restrictive.

  6. #6
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Il vous faudra peut-être passer par un curseur pour encapsuler l'ordre select:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Declare
      type t1 is table of EMP%ROWTYPE ;
      tab1 t1 ;
      cursor c1 is
      select * from emp
      union all
      select * from emp2 ;  
    Begin
      open c1 ;
      fetch c1
      bulk collect
      into tab1 ;
    end;

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

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 13h14
  2. Optimisation SQL et BIND variable
    Par exempleinfo dans le forum Administration
    Réponses: 21
    Dernier message: 17/09/2008, 16h38
  3. [Oracle 9i] Bind variables et sql dynamique
    Par jld_33 dans le forum Oracle
    Réponses: 17
    Dernier message: 09/06/2006, 12h49
  4. DBI et BULK INSERT sur SQL Server
    Par elvivo dans le forum SGBD
    Réponses: 4
    Dernier message: 26/04/2006, 00h47
  5. Réponses: 6
    Dernier message: 24/03/2006, 10h22

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