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 :

PL SQL forALL plusieurs tables


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut PL SQL forALL plusieurs tables
    Bonjour,
    j'ai un petit souci avec un script pl/sql

    voici mon 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
    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
    
    
    DECLARE
      sessionId INT :=5172 ;
      typeExtraction VARCHAR(10) := 'Purge';
      suiviBatch INT := 53652;
      dateDebut VARCHAR(10) := '01/04/2009';
      dateFin VARCHAR(10) := '30/07/2009';
      type typeOperationAEtape is record (
          ope_id   OPERATION.ope_id%type
       ) ;
      type typeOperationPere is record (
          ope_id   OPERATION.ope_id%type,
          id_fonc  OPERATION.OPE_NUM_OPERATION%type
          
      ) ;
      type T_OPERATION_A_ETAPE is table of typeOperationAEtape ;
      type T_OPERATION_PERE is table of typeOperationPere;
      LesOperationAEtapes T_OPERATION_A_ETAPE ;
      LesOperationPeres T_OPERATION_PERE ;
      
      
      CURSOR cursorListePere(fils number) is SELECT 
         ope_id,ope_num_operation
         FROM operation 
        START WITH ope_id=fils 
        CONNECT BY PRIOR ope_id_precedente = ope_id; 
      
    BEGIN
      SELECT
         OPERATION.OPE_ID BULK COLLECT INTO LesOperationAEtapes
         FROM
         OPERATION INNER JOIN TYPE_OPERATION
          ON OPERATION.TYP_TOP_ID = TYPE_OPERATION.TOP_ID
         LEFT OUTER JOIN APUREMENT_INCIDENT_CAISSE
          ON OPERATION.OPE_ID = APUREMENT_INCIDENT_CAISSE.OPE_ID
         LEFT OUTER JOIN APUREMENT_INCIDENT_ATELIER
          ON OPERATION.OPE_ID = APUREMENT_INCIDENT_ATELIER.OPE_ID
         LEFT OUTER JOIN incident_atelier_reception
          ON APUREMENT_INCIDENT_ATELIER.OPE_ID_IAR = incident_atelier_reception.OPE_ID
         LEFT OUTER JOIN incident_caisse_reception
          ON APUREMENT_INCIDENT_CAISSE.OPE_ID_ICR = incident_caisse_reception.OPE_ID
        WHERE
         OPE_DATE_ARCHIVAGE BETWEEN dateDebut AND dateFin
         AND OPE_STATUT_ARCHIVAGE = 'Archivé'
         AND type_operation.TOP_STATUT_FINAL = 'Y'
         AND ((OPERATION.ope_num_operation <> OPERATION.ope_code_regroupement
          OR ope_statut IN ('Annulé','Supprimé')) OR OPERATION.ope_num_operation = OPERATION.ope_code_regroupement)
         AND (TOP_IDENTIFIANT not in ('INCCAEXD','INCCAEXE','INCATBED','INCATBEE'))
         AND ((incident_caisse_reception.ICR_MT_RESTANT_APURER IS NULL AND incident_atelier_reception.IAR_MT_RESTANT_APURER IS NULL)
          OR incident_caisse_reception.ICR_MT_RESTANT_APURER = 0
          OR incident_atelier_reception.IAR_MT_RESTANT_APURER = 0
         );
    
         for I in LesOperationAEtapes.First..LesOperationAEtapes.Last loop
            -- Dbms_Output.Put_Line (LesOperationAEtapes (I).ope_id || ': ');
             OPEN cursorListePere(LesOperationAEtapes (I).ope_id);
             LOOP
                FETCH cursorListePere BULK COLLECT INTO LesOperationPeres LIMIT 1000;
                FORALL J IN 1..LesOperationPeres.COUNT
                INSERT INTO EXTR_ID_ARC_PUR (EXTR_ID,EXT_TYPE_EXTRACTION,SES_ID,SVBATCH_ID,OPE_ID, ID_FONC)  VALUES (S_EXTR_ID_ARC_PUR.NEXTVAL,typeExtraction,sessionId,suiviBatch,LesOperationPeres(J).ope_id,LesOperationPeres(J).id_fonc);
              
              EXIT WHEN cursorListePere%NOTFOUND;
             END LOOP;
             CLOSE cursorListePere;
         END LOOP ;
    end;
    Mon objectif est de récupérer des identifiants techniques selon des critères et récupérer tous ses pères.


    Et les insérer dans une autre table.

    Le souci, c'est que je ne sais pas comment faire pour utiliser le forall dans mon cas, car je récupère des infos d'une table et je dois insérer ces infos dans une autre table avec aussi des variables définies.

    merci d'avance

  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
    Soit vous utilisez deux collections, une pour obtenir les données et une autre pour insérer les données et vous copiez les données entre ces deux collections soit vous utilisez une seule collections et vous le remplissez via un Select qui ramène tous ce qu’il vous faut pour l’insertion.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    c'est ce que j'ai essayé, mais ça fonctionne pas.
    j'ai trouvé un truc intéressant sur le net, mais ça fonctionne que sur le 11g :s !

    à votre avis, y a moyen en 10g de faire marcher ce bout de 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
     
     
    create table main_tab (a number(1),b varchar2(10),c number(5));
    create table odi_tab (a number(1),b varchar2(10));
     
    declare
    type l_rec is record( a number(1),b varchar2(10));
     type l_tab is table of l_rec;
       p_table l_tab;
      begin
        select a,b bulk collect into p_table from odi_tab;
        forall i in 1..p_table.count save exceptions
        insert into main_tab(a,b) values (p_table(i).a,p_table(i).b);
      end;
    Sous 11g, à priori ça fonctionne .... http://www.orafaq.com/forum/t/91972/0/

  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
    Non, vous n'avez pas essayé de faire ce que j'ai propose!
    Le lien que vous citez il vous donne la réponse. Voilà un autre sur comment faire pour contourner ce problème. Et sur ce même site sur les évolutions apporté par la 11g pour ce même problème.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    si si j'avais essayé ! mais à une différence près, ce que la syntaxe du insert est différente de celle qui se trouve dans votre lien !

    Je comprend mieux pourquoi ça ne fonctionnait pas !

    merci !

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

Discussions similaires

  1. [MySQL] Problème requete SQL sur plusieurs tables
    Par Tiib_CD dans le forum Langage SQL
    Réponses: 30
    Dernier message: 21/12/2006, 16h52
  2. Requete SQL jointure plusieurs tables
    Par bibicha dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/08/2006, 17h38
  3. requêtes sql sur plusieurs tables
    Par zahiton dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 10h59
  4. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 16h32
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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