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

SQL Oracle Discussion :

fonctionnement du forall


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 139
    Par défaut fonctionnement du forall
    Bonjour,

    j'aimerai savoir si on peut faire plusieur action dans un forall?

    actuellement je l'utilise comme ceci mais je trouve cela ridicul puisque je dois reparcourir ma table pour faire d'autre opération :

    Actuellement :

    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
     
    PROCEDURE copy_transac_valide IS
    BEGIN
       select * BULK COLLECT into transac_array from transac partition (&2) where origin <> 0;
       forall i in transac_array.first .. transac_array.last
          insert into purge_transac_tmp VALUES transac_array(i);
     
       for rec_t in C_TRANS loop
          for rec_detail in C_DETAIL(rec_t.trans_id) loop
             insert into purge_detail_tmp values (rec_detail.TRANS_ID,rec_detail.RECORD_DATE,rec_detail.NAME,rec_detail.TYPE,rec_detail.STRING_VALUE,rec_detail.NUMBER_VALUE,rec_detail.DATE_VALUE);
          end loop;
       end loop;
     
       commit;
    END;
    mes 2 curseurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CURSOR C_TRANS IS
    	select *
    	from transac partition (&2);
     
    CURSOR C_DETAIL(trans NUMBER) IS
    	select *
    	from transac_detail partition (&2)
    	where trans_id = trans;
    Et je voudrais fair un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    PROCEDURE copy_transac_valide IS
    BEGIN
       select * BULK COLLECT into transac_array from transac partition (&2) where origin <> 0;
       forall i in transac_array.first .. transac_array.last
          insert into purge_transac_tmp VALUES transac_array(i);
          for rec_detail in C_DETAIL(transac_array(i).trans_id) loop
             insert into purge_detail_tmp values (rec_detail.TRANS_ID,rec_detail.RECORD_DATE,rec_detail.NAME,rec_detail.TYPE,rec_detail.STRING_VALUE,rec_detail.NUMBER_VALUE,rec_detail.DATE_VALUE);
          end loop;
     
       commit;
    END;
    C'est possible ou je dois laisser tomber le forall et utiliser un for classique et tout mettre dans ma boucle?

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu sais que tu peux faire un INSERT INTO ... SELECT .... ?
    Ce sera 100 fois plus performant qu'une boucle.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    D'accord avec McM...

    Ne jamais utiliser du code PL/SQL si tu peux le faire avec du SQL simple...

    Sinon dans ton FORALL tu ne peux effectuer qu'une seule action...
    Si tu veux en faire plusieurs, alors il faut utiliser un curseur "classique" (encore moins rapide en passant)

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 139
    Par défaut
    Oki merci.

    En fait j'utilisait deja les curseur classique (pas tres performant effectivement) et la requete SQL directement n'est pas envisageable car les operations s'effectue sur des table de plusieurs millions d'enregistrements et sa explose pour l'insert...

    Je vais rester avec mes bon vieux curseur pour l'instant.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    C'est quoi ton message d'"explosion" pour l'INSERT?

    Parce que c'est un peu bizarre que ça marche en PL mais pas en SQL quand même...

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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