| 12
 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
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 
 |  
create or replace FUNCTION reverse_dump (v_dump varchar2)
   RETURN FLOAT 
AS
   f_res   FLOAT   := 0.0;
 
   n_deb number(10);
   n_fin number(10);
   n_nbr number(10);
   n_expo number(10);
   n_menta number(10);
   /*n_ind number(10);*/
   n number(10) := 0;
 
BEGIN
/* Recuperation du nombre d elements */
   n_deb := (instr(v_dump, 'Len') + 4);
   n_fin := (instr(v_dump, ':'));
   n_nbr := TO_NUMBER(substr(v_dump, n_deb, n_fin-n_deb));
 
 
/* Recuperation de l exposant */
   n_deb := n_fin+2;
   n_fin := (instr(v_dump, ','));
   n_expo := TO_NUMBER(substr(v_dump, n_deb, n_fin-n_deb));
 
/* 3 cas a gerer : Zero + Positif + Negatif */  
   if n_expo = 128 then 
   /* Zero */
     f_res := 0;
   elsif n_expo > 192 then
   /* Positif */
 
 
     /* Pour chaque menta on calcul sa valeur : on se base sur l'exposant - 193 au facteur 100 multiplué par le menta - 1 */
     for n_ind in 1..n_nbr-1
     loop
       n := n + 1;
       n_deb := n_fin+1;
       n_fin := (instr(v_dump, ',', n_deb));
       if n_deb > n_fin then  
         n_menta := TO_NUMBER(substr(v_dump, n_deb)); 
       else
         n_menta := TO_NUMBER(substr(v_dump, n_deb, n_fin-n_deb));
       end if;  
       f_res := f_res + (100**(n_expo - (192+n)) * (n_menta - 1));
 
     end loop;
    elsif n_expo < 63 then 
   /* Negatif */
     for n_ind in 1..n_nbr-1
     loop
       n := n + 1;
       n_deb := n_fin+1;
       n_fin := (instr(v_dump, ',', n_deb));
       if n_deb > n_fin then  
         n_menta := TO_NUMBER(substr(v_dump, n_deb)); 
       else
         n_menta := TO_NUMBER(substr(v_dump, n_deb, n_fin-n_deb));
       end if;  
       if n_menta = 102 then n_menta := 101; end if;
       f_res := f_res + (100**((63-n) - n_expo) * (n_menta - 101));
     end loop;
 
  end if;   
  RETURN f_res;
END reverse_dump; |