Bonjour,

Je fais de la reprise de données (beaucoup de données).

Pour cela, je fais un curseur qui sélectionne des données en base et fais des updates suivant des critères voulus. Le problème est que le traitement dure des heures.
En effet, les updates sont faits un par un.
Mon idée, peut être que vous avez une meilleure, est de faire des updates en parralèle. Le problème est que je ne sais pas comment faire.
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
DECLARE
 a NUMBER(10);
 
 CURSOR C_EMP Is 
 select /*+ full (op) parallel (op, 8) */ * from Table1 op 
 where condition1 
 and   ocondition2;

BEGIN
 For c in C_EMP Loop
 
  SELECT count(*) into a 
  from Table2 ciem 
  where condition3 
        and condition4 
        and ....;
  
  If  a>0
  Then
      update /*+PARALLEL (op, 8) */ Table1 op 
      set    op.b = c,
             op.d=e, 
             .....
      where  condition5
      and    conditions6;
	  
  Else
    update /*+PARALLEL (op, 8) */ Table1 op 
    set    op.b = f,
           op.d=e, 
           .....
    where  condition5
    and    conditions6;
	
  End if ;
  
  IF (MOD(C_EMP%rowcount,1000) = 0) THEN
        BEGIN
             COMMIT;
	    END;
  END IF ;
   
 End loop ;  
END;
/
EXIT;
En bleu le parallélisme que je rajoute. Je le trouve cependant sans intérêt vu que je continue toujours à faire les updates un par un (filtrage sur condition5 et condition6).