Bonjour,

J'ai besoin de supprimer plusieurs lignes d'un table. Seulement cette table est assez grosse (plus de 4 millions de lignes), j'ai l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
DELETE MA_TABLE WHERE poid_list IS NULL
       *
ERROR at line 16:
ORA-30036: unable to extend segment by 8192 in undo tablespace 'UNDO'
Je voudrais mettre en place un curseur afin de commiter tous les 10000 delete par exemple:

J'ai donc mis le code suivant:
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
 
DECLARE
        v_cpt NUMBER(6);
        v_row MA_TABLE%ROWTYPE;
        CURSOR cur_ma_table IS SELECT * FROM MA_TABLE FOR UPDATE OF ID;
BEGIN
        v_cpt := 0;
        OPEN cur_ma_table;
        LOOP
                FETCH cur_ma_table INTO v_row;
                EXIT WHEN cur_ma_table%NOTFOUND;
                DELETE FROM MA_TABLE WHERE CURRENT OF cur_ma_table;
                v_cpt := v_cpt +1;
                IF v_cpt = 10000 THEN
                   v_cpt := 0;
                   CLOSE cur_ma_table;
                   COMMIT;
                   OPEN cur_ma_table;
                END IF;
        END LOOP;
        COMMIT;
        CLOSE cur_ma_table;
END;
/
J'ai l'impression que le CLOSE et le OPEN que je mets dans ma boucle ne sont pas très corrects. Si je les enlève j'ai un:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
"ORA-1002: fetch out of sequence"
Le code est-il correct ? Y'a-t-il un moyen plus intelligent d'éviter l'erreur initiale ?

Je vous remercie.