bonjours;
j'ai le code suivant dont je souhaite optimiser le temps d'execution de mon procedure avec un peu prés 2 mil de lignes ,mais oracle me retourne

impossible d'obtenir un ensemble de lignes stables dans les tables
svp j'ai un projet que je dois finir le plus tôt possible!!

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
CREATE OR REPLACE PROCEDURE get_nom IS
 
 
 v_sigle             NUMBER (1):=1;
 v_datecreation      NUMBER (1):=1;
 v_raisonsociale     NUMBER (1):=1;
 v_idactivite        NUMBER (1):=1;
 
  TYPE aat_id IS TABLE OF tier.IDTIER%type
          INDEX BY PLS_INTEGER;
  TYPE aat_sigle IS TABLE OF tier.sigle%type
          INDEX BY PLS_INTEGER;
  TYPE aat_creation IS TABLE OF tier.datecreation%type
          INDEX BY PLS_INTEGER;
  TYPE aat_raison IS TABLE OF tier.raisonsociale%type
          INDEX BY PLS_INTEGER;
  TYPE aat_ap IS TABLE OF infosactiviteprofessionnelle.idactivite%type
          INDEX BY PLS_INTEGER;
 
	 aa_ids       aat_id;
     aa_creation  aat_creation;
	 aa_activite  aat_ap;
	 aa_raison    aat_raison;
	 aa_sigle     aat_sigle;
 
      -- i PLS_INTEGER := 0;
       u PLS_INTEGER := 0;
 
--  v_number_of_lines   number(30); 
--   
 CURSOR sigledcrs_cur
   IS
      SELECT t.idtier, t.sigle, t.datecreation, t.raisonsociale,
             infop.idactivite
        FROM tier t, infosactiviteprofessionnelle infop
       WHERE (t.sigle IS NULL)
          OR (t.datecreation IS NULL)
          OR (t.raisonsociale IS NULL)
          OR     (infop.idactivite IS NULL)
             AND (    t.typepersonne = 'PP'
                  AND t.idagenteco IN (32)
                  AND t.idactiviteprof = infop.idactiviteprof
                 );
 
BEGIN
 
 
 open sigledcrs_cur;
 
     LOOP
 
	FETCH sigledcrs_cur BULK COLLECT INTO aa_ids,aa_sigle,aa_creation,aa_raison,aa_activite limit 10000;
 
 
      IF  aa_sigle IS NULL
      THEN
         v_sigle  := 1;
      ELSE
         v_sigle  := 0;
      END IF;
 
      IF  aa_creation IS NULL
      THEN
         v_datecreation := 1;
      ELSE
         v_datecreation := 0;
      END IF;
 
      IF aa_raison IS NULL
      THEN
         v_raisonsociale := 1;
      ELSE
         v_raisonsociale := 0;
      END IF;
 
	   IF aa_activite IS NULL
      THEN
           v_idactivite := 1;
      ELSE
           v_idactivite:=  0;
      END IF;
 
	 FORALL i IN 1 .. aa_ids.COUNT
 
     MERGE INTO nfiabilisation nf
     USING(select aa_ids(i) as idtier  from tier) ti
     on(nf.idtier=ti.idtier)
 
	 WHEN MATCHED THEN 	
	 UPDATE  
	 SET sigle=v_sigle,
	 activiteprincipale= v_idactivite,
	 raisonsociale=v_raisonsociale,
	 datecreation=v_datecreation	 
 
 
	-- u := u + SQL%ROWCOUNT;
   --  COMMIT;
 
	--IF SQL%ROWCOUNT = 0 THEN
 
	 WHEN NOT MATCHED THEN	 
      INSERT (IDTIERAFIAB,idtier,sigle,datecreation,raisonsociale,activiteprincipale,TYPEPERSONNE)
      VALUES (nfiabilisation_seq.NEXTVAL,ti.idtier,v_sigle,v_datecreation,v_raisonsociale,v_idactivite,'PP'
                  );
 
   -- i := i + 1;COMMIT;
 	--END IF;
	u := u + SQL%ROWCOUNT;
 
      EXIT WHEN sigledcrs_cur%NOTFOUND;
   END LOOP;
 
 
  close sigledcrs_cur;
    DBMS_OUTPUT.PUT_LINE( u || ' rows merged.' );
   -- DBMS_OUTPUT.PUT_LINE( i || ' rows inserted.' );
 
 
   EXCEPTION
   WHEN NO_DATA_FOUND
   THEN	
      raise_application_error (-20992, 'aucune donnée trouvée');
END get_nom;
/