PL SQL forALL plusieurs tables
Bonjour,
j'ai un petit souci avec un script pl/sql
voici mon code :
Code:
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