2012-06-14 8 views
13

recentemente, mentre lavoravo su un progetto di migrazione oracle db2 ->, ci siamo imbattuti in questa situazione. gli sviluppatori stavano creando inavvertitamente nuove strutture di tabella usando colonne decimali (s, p). Non ricordavo che Oracle supportasse questo, ma poi alcuni scavi hanno dimostrato che è un tipo di dati ANSI quindi supportato da Oracle.decimale (s, p) o numero (s, p)?

Tuttavia, domanda per me è rimasto -

  1. come è questo di dati gestita internamente?
  2. C'è un costo di utilizzo dei tipi ANSI invece dei tipi integrati di Oracle?
  3. Si verificherà un impatto durante la migrazione dei dati se il tipo di destinazione era di tipo Oracle integrato?

risposta

17

In Oracle, they are the same: dichiarazioni

SQL che creano le tabelle ei cluster possono anche utilizzare i dati ANSI tipi e tipi di dati dai prodotti IBM SQL/DS e DB2. Oracle riconosce il nome del tipo di dati ANSI o IBM che differisce dal nome del tipo di dati del database Oracle . Converte il tipo di dati nell'equivalente tipo di dati Oracle , registra il tipo di dati Oracle come il nome del tipo di dati della colonna e memorizza i dati della colonna nel tipo di dati Oracle in base alle conversioni mostrate nelle tabelle che seguono.

La tabella che segue questa citazione mostra che DECIMAL(p,s) viene trattato internamente come 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 

Tuttavia, le impostazioni predefinite scala a 0 per DECIMAL, il che significa che DECIMAL(*) è trattato come NUMBER(*, 0), cioè 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 di prestazione dovuto alla conversione? – Gyan

+1

Non c'è conversione di dati: 'DECIMAL' è memorizzato e trattato come un' NUMBER'. –

+3

@ learn4living - Oracle non sta convertendo i dati (i valori memorizzati nella colonna) sta convertendo i metatdata (cosa è memorizzato nel dizionario dei dati). Quindi l'unico costo è il prezzo che stai pagando ora: confusione tra i professionisti Oracle che affrontano i tipi di dati non Oracle. – APC

-2

In realtà, c'è differenza tra decimale e numero. Decimale troncherà il valore che è sovradimensionato, il numero arrotonda il valore.

+4

Mi piacerebbe molto vedere una dimostrazione di questo. [Questo violino] (http://www.sqlfiddle.com/#!4/23fb7/1) sembra indicare che sia il NUMBER che il DECIMAL arrotondano i valori di sovradimensionamento. –