Taking in account the definition from Oracle:
DATA_LENGTH is the length of the column (in bytes). DATA_PRECISION is the decimal precision for NUMBER datatype, the binary precision for FLOAT datatype, null for all other datatypes. DATA_SCALE is the digits to right of decimal point in a number
Let's put an example:
SQL> create table check_size ( c1 number, c2 number(6) , c3 number(6,3) );
Table created.
SQL> set lines 200
SQL> r
1 SELECT COLUMN_NAME,
2 DATA_TYPE,
3 DATA_LENGTH,
4 DATA_PRECISION,
5 DATA_SCALE
6 FROM ALL_TAB_COLS
7 WHERE OWNER='TEST'
8* AND TABLE_NAME = 'CHECK_SIZE'
COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE
------------------------------ ------------------------------ ----------- -------------- ----------
C1 NUMBER 22
C2 NUMBER 22 6 0
C3 NUMBER 22 6 3
As you can see, data_length is always 22. That is because numbers are stored as packets, so the dictionary will show you always 22, but I can insert a number greater than 22 digits.
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 999.99 );
1 row created.
SQL> select dump(c1) as content from check_size ;
CONTENT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Typ=2 Len=2: 215,2
However, in your case you say data precision 5 and data scale 1, so let's truncate the table and modify the column:
SQL> truncate table check_size ;
Table truncated.
SQL> alter table check_size modify c3 number ( 5,1 );
Table altered.
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 99 );
1 row created.
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 9999.9 );
1 row created.
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 9999.99 );
insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 9999.99 )
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
Summarising, with data scale 5 and data precision 1, you can store a number in any type up to this maximum precision + scale. So I can store 9999.9 and 99 ( scale and precision are advisory ) but I cannot 9999.99 , because my scale is 1 and here the number has 2 decimals.
Hope it clarifies
Regards