[Débutant] Fetch across commits
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:
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:
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:
"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. :P