Bonjour à tous (et à toutes),
Voilà mon petit problème : tous les jours (sauf arrêt des tâches automatiques), je récupère des infos d'un autre système afin de tracer d'éventuels changements d'état de mes enregistrements. Chaque fois qu'un état est modifié, je stocke la date et l'état.
Malheureusement, un bug a fait que le stockage avait lieu systématiquement (même quand l'état n'a pas changé).
Je me retrouve donc avec une base à nettoyer
Ci-dessous, un extrait de la table à nettoyer (avec en rouge les lignes à supprimer) :
Je me suis lancé dans une procédure Oracle qui, à l'heure actuelle, ressemble à çà :
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 ORDER_ID DATE STATE 47087 07/07/2010 15:31 0 47087 13/07/2010 05:08 5 47087 14/07/2010 06:04 5 47087 15/07/2010 06:46 5 47087 21/07/2010 05:07 5 47087 22/07/2010 05:00 5 47087 23/07/2010 05:13 9 47087 24/07/2010 05:14 9 47087 25/07/2010 05:27 9 47087 26/07/2010 05:11 9 47087 27/07/2010 05:08 15 47088 07/07/2010 15:31 0 47088 13/07/2010 05:06 5 47088 14/07/2010 06:55 5 47088 15/07/2010 05:54 5 47088 21/07/2010 05:11 5 47088 22/07/2010 05:03 5 47088 23/07/2010 05:13 9 47088 24/07/2010 05:02 9 47088 25/07/2010 05:01 9 47088 26/07/2010 05:11 9 47088 27/07/2010 05:21 15 47089 07/07/2010 15:31 0 47089 13/07/2010 05:06 10 47089 14/07/2010 06:01 10 47089 15/07/2010 06:14 10 47089 21/07/2010 05:01 10 47089 22/07/2010 05:11 10 47089 23/07/2010 05:13 10 47089 24/07/2010 05:05 10 47089 25/07/2010 05:04 10 47089 26/07/2010 05:11 10 47089 27/07/2010 05:16 14
C'est loin d'être terminé et voilà ce que je comptais faire :
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 DECLARE -- Parcourir chaque ligne de commande CURSOR iterOrderIds_cur IS SELECT DISTINCT order_id FROM state_history; -- Stocker l'id de la commande courante currentOrderId_rec iterOrderIds_cur%ROWTYPE; -- Parcourir chaque état pour une ligne de commande CURSOR iterOrderStates_cur (orderId_in NUMBER) IS SELECT DISTINCT hist_at_state FROM state_history WHERE order_id = orderId_in; -- Stocker l'état courant currentState_rec iterOrderStates_cur%ROWTYPE; BEGIN -- Parcourir l'historique des états pour chaque ligne de commande FOR currentOrderId_rec IN iterOrderIds_cur LOOP dbms_output.put_line(currentOrderId_rec.order_id); -- Pour chaque ligne de commande, parcourir les états AT de l'historique FOR currentState_rec IN iterOrderStates_cur(currentOrderId_rec.order_id) LOOP dbms_output.put_line(currentState_rec.hist_at_state); -- A SUIVRE... END LOOP; END LOOP; END;
- pour chaque état d'une ligne de commande, rechercher l'enregistrement avec la date la plus récente (SELECT ...)
- supprimer les autres lignes (DELETE ...)
Mais çà me parait laborieux et je me demande si je suis sur la bonne piste ou bien si une solution plus simple existe ?
Par exemple en utilisant des fonctions sur les dates ?
Je suis donc preneur de conseils et/ou des commentaires qui pourraient éclairer ma lanterne et m'aider à partir dans le bon sens
Merci d'avance
Cordialement.
S.
Partager