Bonjour,
Je suis en train de mettre en place un script de rebuild d'indexes (voir ci-dessous) :
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
EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME          => 'SCOTT', -
                                       OPTIONS          => 'GATHER AUTO', -
                                       ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE, -
                                       METHOD_OPT       => 'FOR ALL COLUMNS SIZE AUTO', -
                                       DEGREE           => 35, -
                                       GRANULARITY      => 'AUTO', -
                                       CASCADE          => TRUE, -
                                       FORCE            => TRUE);
 
 
 
SET serveroutput ON size unlimited 
SET pagesize  0 
SET linesize  132 
SET feedback  ON 
SET echo      ON 
SET trimspool ON 
SET verify    ON 
 
DECLARE
  v_Owner     all_indexes.owner%TYPE;
  v_IdxName   all_indexes.index_name%TYPE;
  v_NumRows   INTEGER;
  v_Height    index_stats.height%TYPE;
  v_LfRows    index_stats.lf_rows%TYPE;
  v_DLfRows   index_stats.del_lf_rows%TYPE;
  v_DLfPerc   NUMBER;
  v_MaxHeight NUMBER;
  v_MaxDel    NUMBER;
 
  CURSOR cur_GetIdx IS SELECT owner,
                              index_name,
                              num_rows
                         FROM all_indexes
                        WHERE OWNER NOT LIKE 'SYS%'
                        AND num_rows IS NOT NULL
                        ORDER BY num_rows desc ;
BEGIN
  v_MaxHeight := 1;
  v_MaxDel    := 2;
 
  FOR CUR IN cur_GetIdx LOOP
     v_Owner := CUR.owner ;
     v_IdxName := CUR.index_name ;
     v_NumRows := CUR.num_rows ;
     DBMS_OUTPUT.PUT_LINE(v_Owner || ' ' || v_IdxName || ' ' || v_NumRows);
 
     SELECT height,
	   lf_rows,
	   del_lf_rows INTO v_Height,v_LfRows,v_DLfRows
       FROM INDEX_STATS ;
 
     IF v_DLfRows = 0 THEN
        v_DLfPerc := 0;
     ELSE
        v_DLfPerc := (v_DLfRows / v_LfRows) * 100;
     END IF;
     IF (v_Height > v_MaxHeight) OR (v_DLfPerc > v_MaxDel) THEN 
        DBMS_OUTPUT.PUT_LINE('ALTER INDEX ' || v_Owner || '.' || v_IdxName || ' REBUILD;');
     END IF;
 
  END LOOP;
 
END;
/
J'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
SH CUSTOMERS_PK 55500
DECLARE
*
ERREUR Ó la ligne 1 :
ORA-01403: no data found
ORA-06512: at line 31
J'ai réussi à isoler cette erreur qui provient de la partie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
     SELECT height,
	   lf_rows,
	   del_lf_rows INTO v_Height,v_LfRows,v_DLfRows
       FROM INDEX_STATS ;
Mais je ne comprends pas pourquoi cette sort ?
Quelqu'un a t'il une petite idée ?
Merci par avance.