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.