decimal(s,p) or number(s,p)?
Asked Answered
T

2

23

recently, while working on a db2 -> oracle migration project, we came across this situation. the developers were inadvertently creating new table structures using decimal(s,p) columns. I didn't remember Oracle supporting this, but then some digging showed that its a ANSI data type therefore supported by oracle.

However, question for me remained -

  1. how is this data handled internally ?
  2. is there a cost of using ANSI types instead of Oracle's built in types ?
  3. Will there be an impact during the data migration if the target type was Oracle built-in type ?
Tweezers answered 14/6, 2012 at 10:42 Comment(0)
A
22

In Oracle, they are the same:

SQL statements that create tables and clusters can also use ANSI data types and data types from the IBM products SQL/DS and DB2. Oracle recognizes the ANSI or IBM data type name that differs from the Oracle Database data type name. It converts the data type to the equivalent Oracle data type, records the Oracle data type as the name of the column data type, and stores the column data in the Oracle data type based on the conversions shown in the tables that follow.

The table below this quote shows that DECIMAL(p,s) is treated internally as a NUMBER(p,s):

SQL> create table t (a decimal(*,5), b number (*, 5));

Table created

SQL> desc t;
Name Type        Nullable Default Comments 
---- ----------- -------- ------- -------- 
A    NUMBER(*,5) Y                         
B    NUMBER(*,5) Y  

However, the scale defaults to 0 for DECIMAL, which means that DECIMAL(*) is treated as NUMBER(*, 0), i.e. INTEGER:

SQL> create table t (a decimal, b number, c decimal (5), d decimal (5));

Table created

SQL> desc t;
Name Type      Nullable Default Comments 
---- --------- -------- ------- -------- 
A    INTEGER   Y                         
B    NUMBER    Y                         
C    NUMBER(5) Y                         
D    NUMBER(5) Y   
Alis answered 14/6, 2012 at 11:0 Comment(4)
There is no data conversion: DECIMAL is stored and treated as a NUMBER.Alis
@learn4living - Oracle is not converting the data (values stored in column) it is converting the metatdata (what is stored in the data dictionary). So the only cost is the price you are paying now: confusion amongst Oracle practitioners faced with non-Oracle datatypes.Mercurous
Well, in our project, the scale defaulting to zero made the diff and the research worthwhile. Thanks everyone for the pointers.Tweezers
@VincentMalgrat: DECIMAL is not exactly the same as NUMBER. As defined in SYS.STANDARD DECIMAL is defined as NUMBER(38, 0), so a variable defined as DECIMAL cannot contain any digits to the right of the decimal point, while something defined as NUMBER can. To have DECIMAL values with digits to the right of the decimal point they have to be defined as e.g. DECIMAL(38, 4). Share and enjoy.Friedland
O
-4

Actually, there is difference between decimal and number. Decimal will truncate the value which is over-scale, number will round the value.

Origan answered 19/12, 2012 at 3:31 Comment(1)
I'd sure love to see a demonstration of this. This fiddle seems to indicate that both NUMBER and DECIMAL round over-scale values.Friedland

© 2022 - 2024 — McMap. All rights reserved.