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