Code du jour: Après une division par zéro? un bon break

Publié le 13 novembre 2008 par Wtf

Connaissez-vous le jeu the incredible machine? Le but de ce jeu était de créer des réactions en chaîne très compliquées pour réaliser des objectifs simples comme percer un ballon ou mettre une balle dans un trou. Lorien travaille dans une société de prestation, il a eu la chance de croiser lors d'une de ses missions chez un client, un développeur qui rend hommage à "The Incredible Machine" en reproduisant le concept dans ses développements.
Voici une partie d'un script planifié toutes les nuits :

while :
do

 sqlplus TestProgress.sql $COMPANY BATCH $PLINKCODE

 if [ $? -eq 0 ]
 then
       sleep 60
 else
       echo "Stop"
       break
 fi

done

Une boucle infinie qu'une réponse de la part de sqlplus peut interrompre via un break. Pas terrible, mais Lorien a connu pire, regardons de plus près le script sql.

whenever sqlerror exit sql.sqlcode rollback
whenever oserror exit oscode rollback

WHENEVER SQLERROR exit FAILURE

DECLARE
   ok  varchar2(1);
   XXX number := 0;
BEGIN

   select decode(state,'322','1','0') into ok
   from oas_ledprogress
   where cmpcode = '&1'
   and usrname = '&2'
   and ledcode = '&3';

   if ok = '1' then
       XXX := XXX / 0;
   else
       XXX := XXX / 1;
   end if;

END;
/

exit;

Dans une boucle infinie, toutes les 60 secondes, un script vérifie la présence d'une entrée dans la base. Si elle n'est pas présente, il se termine normalement et recommence sa vérification 60 secondes plus tard. S'il trouve la valeur, il effectue une division par zéro, qui sort donc le script Oracle en erreur. Cette erreur récupérée permettra de sortir de la boucle infinie (fonctionnement normal) par un break et de continuer la fin du script "normalement".

D'après Wikipedia : La créativité d'un individu ou d'un groupe est sa capacité à produire sur commande en un temps donné une quantité donnée de solutions, d'idées ou de concepts permettant de réaliser de façon efficace et inattendue un effet ou une action.

Curieusement, dans notre domaine, le résultat est plus souvent inattendu qu'efficace...