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 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; |