Bonjour,
Dans le cadre de mon travail, je maintiens une application qui reçoit des données d'une autre application.
Les données reçues sont envoyées vers une table ENTREE, via une procédure PLSQL.
Depuis quelques temps, 99% des transactions se font correctement.
Mais pour une poignée d'entre elles, ca ne passe pas.
Et on m'a demandé pourquoi en me précisant bien "c'est toujours sur les 3 ou 4 mêmes clients que ca bloque"
Du coup, j'ai regardé la tête des données qui transitent de l'application en amont de la mienne (j'ai accès à l'historique des lignes envoyées chez moi).
J'ai fait une comparaison ligne_qui_passe vs ligne_qui_passe_pas, sans rien trouver d'intéressant.
J'ai regardé le procédure PLSQL, sans rien trouver de flagrant.
Du coup, je me suis créé une table de LOG, et dans la procédure PLSQL, j'ai collé plein d'INSERT INOT MA_TABLE_DE_LOG, avec la date, l'heure, le nom du client.
Selon les endroits, j'ai rajouté au bout de mon INSERT un flag qui me dit où il est passé dans la procédure.
Donc, pour une ligne qui passe, j'ai des lignes dans ma table qui reessemblent à:
COMMENTAIRES
3 - entrée: 102085 | client: TOTO | 28/02/2012 03:02:14 | APPEL PROCEDURE
4 - entrée: 102085 | client: TOTO | 28/02/2012 03:02:14 | INSERTION
5 - entrée: 102085 | client: TOTO | 28/02/2012 03:03:01 | APPEL PROCEDURE
6 - entrée: 102085 | client: TOTO | 28/02/2012 03:03:01 | MISE A JOUR
7 - entrée: 102086 | client: TUTU | 28/02/2012 03:12:19 | APPEL PROCEDURE
8 - etc ...
Comme ça, je peux voir que le 28 à 15:02:14, la procédure a été appelée, que quasimment instantanément, il y a eu une insertion et que 47 sec plus tard, un utilisateur a du changer une donnée sur son écran, qui se répercute chez moi par un 2ème lancement de la procédure + un update (la ligne a déjà été crée, donc on UPDATE)
J'ai laissé tourner le bazar quelques jours et rebellote "Il nous manque des lignes".
Je vais voir ma log: aux heures indiquées, je vois bien les appels, les INSERT/UPDATE.
Je me suis donc dit que l'INSERT devait peut être merdouiller quelque part.
Je me suis donc rajouté une partie EXCEPTION à la fin de la procédure PLSQL, pour piéger les éventuelles erreurs.
Je teste ça sur ma base de dev, je maltraite quelques données pour insérer des doublons, faire rentrer des VARCHAR dans des NUMBER, etc
Ca marche.
En cas d'erreur, j'aurias une ligne horodatée, avec le SQLCODE, SQLERRM, etc
De plus, je crée un trigger sur ma table ENTREE: à chaque insertion ou udpate, je rajoute une ligne dans ma table de log avec horodatage, type d'action (INS/UPD), etc ...
Je valide tout ça et je laisse tourner.
Rerebelote, il manque des lignes.
Je vais fouiner dans ma table de log et je constate que, comme précédemment, ma procédure PLSQL s'est bien lancée, et qu'elle est passé par les instructions d'insert/update.
Je constate aussi que le trigger à l'insertion s'est bien déclenché comme le dit la ligne: 28/02/2012 03:02:30 | TRIG INS | Entrée 102085
Et par contre, pas de ligne d'erreur/exception.
Et quand je vais voir dans ma table, à l'heure donnée, pour le client donnée, il n'y a aucune ligne...
En résumé:
[*] Ma procédure se lance correctement.[*] Elle donne bien l'ordre d'insertion/update[*] Aucune erreur n'est détectée[*] Le trigger se déclenche
=> Plein de rien dans ma table entrée...
Je ne sais pas où chercher ....
Si vous avez des idées, des trucs à me faire tester, défoulez vous
Merci d'avance.
Partager