Use VARCHAR2
instead of NUMBER
:
SQL> DECLARE
2 FUNCTION modbig(iban VARCHAR2) RETURN VARCHAR2 IS -- won't be rounded
3 lengthIban NUMBER(38);
4 modUitkomts NUMBER(38);
5 modUitkomtsc VARCHAR(38);
6 restIban VARCHAR(50);
7 modlength NUMBER(38);
8 BEGIN
9 restIban := iban;
10 modUitkomts := SUBSTR(restIban, 0, 9) MOD 97;
11 modUitkomtsc := LPAD(modUitkomts, 2, '0');
12 restIban := concat(modUitkomtsc, SUBSTR(iban, 10));
13
14 LOOP
15 IF (length(restIban) >= 9) THEN
16 modUitkomts := SUBSTR(restIban, 0, 9) MOD 97;
17 modUitkomtsc := LPAD(modUitkomts, 2, '0');
18 restIban := concat(modUitkomtsc, SUBSTR(restIban, 10));
19 ELSE
20 EXIT;
21 END IF;
22 END LOOP;
23 modUitkomts := restIban MOD 97;
24 RETURN modUitkomts;
25 END modbig;
26
27 BEGIN
28 DBMS_OUTPUT.PUT_LINE(
29 modbig('221021290110000123452229211210282900128222984')); -- varchar2
30 END;
31 /
1
PL/SQL procedure successfully completed
Explanation: the NUMBER
dataype has a precision of about 38 digits, so this will be rounded for very large number, hence your output ending in 0000
instead of the digits you did input.