Very simple example:
create table t_integer(i integer); insert into t_integer values(1e125); select * from t_integer; declare i1 integer; begin select i into i1 from t_integer; end; / declare i2 t_integer.i%type; begin select i into i2 from t_integer; end; /
Although variable and the column specified as “integer”, but in both blocks you will get error: ORA-06502: PL/SQL: numeric or value error: number precision too large.
Same error will be with “int“.
Describe shows wrong datatype:
> desc t_integer; Name Null? Type --------------------------- -------- ---------- I NUMBER(38)
Really it would be number without precision and scale=0. You can see it in dba_tab_columns.
sys.standard:
subtype INTEGER is NUMBER(38,0); subtype INT is INTEGER;
Also a couple simple good-known but often forgotten things:
1. integer as parameter type or return type:
SQL> create function f_integer(i integer)
2 return integer is
3 begin
4 return i;
5 end;
6 /
Function created.
SQL> select f_integer(1/3) from dual;
F_INTEGER(1/3)
--------------
.333333333
1 row selected.
2. Old finding from sql.ru – no casting in assignments (from 10.2 till 11.2, was found by Elic):
declare
numberVar number := 1/3;
numberVar2 number(20,10) := 1/3;
procedure Test(Label varchar2, Value int)
is
LocalVar int := Value;
begin
dbms_output.put_line(Label || ' : ' || Value);
dbms_output.put_line(Label || ' assigned: ' || LocalVar);
end Test;
begin
Test('| const', 1/3);
Test('| number var', numberVar);
Test('|constrained number var', numberVar2);
end;
/
| const : .3333333333333333333333333333333333333333
| const assigned: .3333333333333333333333333333333333333333
| number var : .3333333333333333333333333333333333333333
| number var assigned: .3333333333333333333333333333333333333333
|constrained number var : .3333333333
|constrained number var assigned: .3333333333
PL/SQL procedure successfully completed.
