Handling Large Numbers in Oracle
Handling Large Numbers in Oracle
2
--THE ABOVE FUNCTION IS PRINTING THE SAME TOTAL FOR BOTH THE ABOVE LARGE NUMBERS
.
WHICH IS INCORRECT.
--WROTE AN ADHOC PROCEDURE TO HANDLE NUMBERS LARGER THAN 38 DIGITS.
SQL>
SQL>
2
3
4
5
6
7
8
9 v_num:=replace( v_num,v_dgt,i);
10 dbms_output.put_line(length(v_num)||' '||v_num);
11 v_str:=v_num;
12 for j in 1..3 loop
13 v_str:=v_str||i;
14 dbms_output.put_line(length(v_str)||' '||v_str);
15 end loop;
16 v_dgt:=i;
17 exception
18 when others then
19
20 dbms_output.put_line(i||' '||sqlerrm);
21 end;
end loop;
22 23 end;
24 /
39 111111111111111111111111111111111111111
40 1111111111111111111111111111111111111111
41 11111111111111111111111111111111111111100
42 111111111111111111111111111111111111111000
39 222222222222222222222222222222222222222
40 2222222222222222222222222222222222222222
41 22222222222222222222222222222222222222200
42 222222222222222222222222222222222222222000
39 333333333333333333333333333333333333333
40 3333333333333333333333333333333333333333
41 33333333333333333333333333333333333333300
42 333333333333333333333333333333333333333000
39 444444444444444444444444444444444444444
40 4444444444444444444444444444444444444444
41 44444444444444444444444444444444444444400
42 444444444444444444444444444444444444444000
39 555555555555555555555555555555555555555
40 5555555555555555555555555555555555555555
41 55555555555555555555555555555555555555600
42 555555555555555555555555555555555555556000
39 666666666666666666666666666666666666666
40 6666666666666666666666666666666666666666
41 66666666666666666666666666666666666666700
42 666666666666666666666666666666666666667000
39 777777777777777777777777777777777777777
40 7777777777777777777777777777777777777777
41
42
39
40
41
42
39
40
42
43
77777777777777777777777777777777777777800
777777777777777777777777777777777777778000
888888888888888888888888888888888888888
8888888888888888888888888888888888888888
88888888888888888888888888888888888888900
888888888888888888888888888888888888889000
999999999999999999999999999999999999999
9999999999999999999999999999999999999999
100000000000000000000000000000000000000000
1000000000000000000000000000000000000000000
3 4
4 7
5 1
6 1
7 7
8 4
9 4
10 8
11 7
12 5
13 0
14 9
15 3
16 2
17 6
18 6
19 2
20 6
21 6
22 8
23 3
24 7
25 3
26 4
27 6
28 6
29 5
30 9
31 7
32 1
33 0
34 5
35 1
36 5
37 5
38 4
39 5
40 2
41 0
42 0
43 0
44 0
45 0
46 0
47 0
48 0
49 0
50 0
51 0
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
61 0
62 0
63 0
64 0
182
3
1 1
2 8
3 2
11
2
1 1
2 1
2
2
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.01
07341
old 4: v_num varchar2(2000):='&num';
new 4: v_num varchar2(2000):='534711744875093266266837346659710515545198137192
1085124486107341';
64
1 5
2 3
3 4
4 7
5 1
6 1
7 7
8 4
9 4
10 8
11 7
12 5
13 0
14 9
15 3
16 2
17 6
18 6
19 2
20 6
21 6
22 8
23 3
24 7
25 3
26 4
27 6
28 6
29 5
30 9
31 7
32 1
33 0
34 5
35 1
36 5
37 5
38 4
39 5
40 1
41 9
42 8
43 1
44 3
45 7
46 1
47 9
48 2
49 1
50 0
51 8
52 5
53 1
54 2
55 4
56 4
57 8
58 6
59 1
60 0
61 7
62 3
63 4
64 1
276
3
1 2
2 7
3 6
15
2
1 1
2 5
6
6
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.02
--MODIFIED MY FUNCTION ACCORDINGLY, TO STORE THE INPUT VALUE IN A STRING VARIABL
E AND PROCESS.
create or replace function num_tot(i_num in varchar2)
return number is
v_len number;
v_tot number;
v_num varchar2(2000):=i_num;
begin
v_len:=length(v_num);
<<WHILE_LOOP>>
v_tot:=0;
for i in 1..v_len loop
v_tot:=v_tot+to_number(substr(v_num,i,1));
end loop;
v_num:=v_tot;
v_len:=length(v_num);
if (v_len > 1) then
goto WHILE_LOOP;
end if;
return v_tot;
end;
SQL>
Enter
07341
old
new
7
8
110679
110788
7 rows selected.
Elapsed: 00:00:06.32 --HERE THE FUNCTION TAKES A NUMERICAL VALUE OF DIGITS AND P
ROCESSES.
HAPPY SCRIPTING