2012-06-14 23 views
13

recientemente, mientras trabajábamos en un proyecto de migración db2 -> oracle, nos topamos con esta situación. los desarrolladores crearon inadvertidamente nuevas estructuras de tabla usando columnas decimales (s, p). No recordaba que Oracle apoyara esto, pero luego algunas excavaciones mostraron que es un tipo de datos ANSI, por lo tanto, es compatible con Oracle.decimal (s, p) o número (s, p)?

Sin embargo, la pregunta para mí permanecieron -

  1. cómo se manejan internamente estos datos?
  2. ¿Hay un costo de usar tipos ANSI en lugar de los tipos integrados de Oracle?
  3. ¿Habrá un impacto durante la migración de datos si el tipo de destino fue el tipo de Oracle incorporado?

Respuesta

17

En Oracle, they are the same: declaraciones

SQL que crean tablas y grupos también pueden utilizar los datos ANSI tipos y tipos de datos a partir de los productos de IBM SQL/DS y DB2. Oracle reconoce el nombre de tipo de datos ANSI o IBM que difiere del nombre del tipo de datos de la base de datos Oracle . Convierte el tipo de datos al tipo de datos Oracle equivalente , registra el tipo de datos Oracle como el nombre del tipo de datos de columna y almacena los datos de columna en el tipo de datos Oracle según las conversiones que se muestran en las tablas siguientes.

La tabla a continuación esta cita muestra que DECIMAL(p,s) se trata internamente como un 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 

Sin embargo, los valores predeterminados de escala a 0 para DECIMAL, lo que significa que DECIMAL(*) se trata como NUMBER(*, 0), es decir 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 
+0

¿costo de rendimiento debido a la conversión? – Gyan

+1

No hay conversión de datos: 'DECIMAL' se almacena y trata como' NÚMERO'. –

+3

@ learn4living - Oracle no está convirtiendo los datos (valores almacenados en la columna) que está convirtiendo los metadatos (lo que está almacenado en el diccionario de datos). Entonces, el único costo es el precio que está pagando ahora: confusión entre los profesionales de Oracle que enfrentan tipos de datos que no son de Oracle. – APC

-2

En realidad, hay una diferencia entre el decimal y el número. Decimal truncará el valor que está sobre escala, el número redondeará el valor.

+4

Me encantaría ver una demostración de esto. [Este violín] (http://www.sqlfiddle.com/#!4/23fb7/1) parece indicar que tanto NUMBER como DECIMAL redondean los valores por encima de la escala. –