tu enléves tout, tu fais ton trigger et après tu pourras faire un simple DELETE
tu enléves tout, tu fais ton trigger et après tu pourras faire un simple DELETE
Mais comme ça je vais avoir 3 select imbriqués
Et en plus, si y aura une ligne qui n est pas bien inserée, le trigger va sortir, alors que moi je dois suivre les lignes une par une
C est à dire si une ligne n'est pas inserer, je ne la supprime pas de la table et je passe à la ligne suivante
mais comme ça on va tomber dans le meme cas nn?
la question est : Pourquoi tu veux faire un BULK COLLECT ?
Chui obligé de le faire
Je veux traiter les enregistrement par lots de 1000 lignes
En plus dans ma requete ce que je comprends pas c'est qu'en virant le commit sa marche, mais si je mets le commit on dirait que le loop de fetch ne marche plus, il s'arrete au premier lot de 1000 enregistrements
Parce que tu as une exception déclenchée que tu ne vois pas à cause du WHEN OTHERS... je te l'ai déjà dit
Et le traitement pas lot c'est bien mais alors ça veut dire que tu acceptes qu'en cas d'erreur tu peux avoir 1000 lignes non traitées ?
Moi ce que je veux faire c'est : traiter les enreg par lot de 1000
pour chaque 1000 enreg, les parcourir un par un inserer et supprimer chacun(boucle for), si je rencontre un probleme pour un enregistrement je passe au suivant
Apres je passe au lot suivant
supprime la partie EXCEPTION pour voir l'erreur... je ne le dirais pas une 4eme fois
effectivement j'ai eu l erreur ORA-00600 : internal error code
je comprends pas
Si je vire le commit j ai pas cet erreur
Le probleme c'est l'utilisation du for update skip locked
est ce que vous avez une solution pour ça
Il faut que je prends que les enregistrements qui sont pas loked
c a d si un enregistrement est utilisé par une autre session, il faut pas trop attendre pour qu'il soit libreré
ce qui fou la merde c'est le skip locked, parce que en mettant le commit dans la boucle tout change, il faut faire qu un seul commit à la fin
Moi je veux faire le test suivant :
pour chaque ligne ramener par le curseur, il ne faut le supprimer que si elle est bien inserée et inversement
Voulez vous m aider pour ce test
pourquoi c est une faute grave?
il faut que je l'utilise pour ne prendre que les enregistrement non utilisés
Voilà un test pour ceux qui aiment les triggers
A) Sans trigger
B) Avec trigger
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 lock table big_table in exclusive mode nowait / insert /*+ APPEND */ Into big_hist Select * from big_table where owner = 'PUBLIC' / delete mni.big_table Where owner = 'PUBLIC' / commit /
Tkprof Sans trigger
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 Create Or Replace Trigger BD_Big_Table Before Delete On Big_Table For Each Row Begin insert into big_hist (owner, object_name, subobject_name, object_id, data_object_id, object_type, created, last_ddl_time, timestamp, status, temporary, generated, secondary) values (:old.owner, :old.object_name, :old.subobject_name, :old.object_id, :old.data_object_id, :old.object_type, :old.created, :old.last_ddl_time, :old.timestamp, :old.status, :old.temporary, :old.generated, :old.secondary); End; / delete mni.big_table Where owner = 'PUBLIC' / commit /
Tkprof Avec trigger
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 delete mni.big_table Where owner = 'PUBLIC' call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 6.83 158.51 9249 1866 274898 239616 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 6.83 158.52 9249 1866 274898 239616 insert /*+ APPEND */ Into big_hist Select * from big_table where owner = 'PUBLIC' call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.03 0 0 0 0 Execute 1 1.62 21.23 7639 21577 1137 239616 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 1.62 21.26 7639 21577 1137 239616
A parte les différences en temps CPU, et Elapsed, j'aime bien les 239663 exécutions pour insérerer 239616 lignes
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 delete mni.big_table Where owner = 'PUBLIC' call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 27.34 197.61 7061 17665 993822 239616 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 27.34 197.62 7061 17665 993822 239616 INSERT INTO BIG_HIST (OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS, TEMPORARY, GENERATED, SECONDARY) VALUES (:B1 , :B2 , :B3 , :B4 , :B5 , :B6 , :B7 , :B8 , :B9 , :B10 , :B11 , :B12 , :B13 ) call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.02 0 0 0 0 Execute 239663 12.51 81.02 5 3397 266709 239663 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 239664 12.51 81.04 5 3397 266709 239663
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager