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 :
Je voudrais mettre en place un curseur afin de commiter tous les 10000 delete par exemple:
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'
J'ai donc mis le code suivant:
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
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; /
Le code est-il correct ? Y'a-t-il un moyen plus intelligent d'éviter l'erreur initiale ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part "ORA-1002: fetch out of sequence"
Je vous remercie.![]()
Partager