2012-06-14 54 views
13

В последнее время, работая над проектом миграции db2 -> oracle, мы столкнулись с этой ситуацией. разработчики непреднамеренно создавали новые структуры таблиц с использованием десятичных (s, p) столбцов. Я не помнил, что Oracle поддерживал это, но затем некоторые копания показали, что его тип данных ANSI поэтому поддерживается oracle.десятичный (s, p) или номер (s, p)?

Однако, для меня вопрос остался -

  1. как эти данные обрабатываются внутри?
  2. есть ли стоимость использования типов ANSI вместо встроенных типов Oracle?
  3. Будет ли влияние во время переноса данных, если целевой тип был встроенным в Oracle?

ответ

17

В Oracle they are the same: заявления

SQL, которые создают таблицы и кластеры могут также использовать данные ANSI типов и тип данных из продуктов IBM SQL/DS и DB2. Oracle распознает имя типа данных ANSI или IBM, которое отличается от имени типа данных базы данных Oracle . Он преобразует тип данных в эквивалентный тип данных Oracle Oracle, записывает тип данных Oracle как имя типа данных столбца и сохраняет данные столбца в типе данных Oracle на основе преобразований, показанных в последующих таблицах.

В таблице ниже этой цитаты видно, что DECIMAL(p,s) трактуется внутренне как 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 

Однако масштаб по умолчанию 0 для DECIMAL, что означает, что DECIMAL(*) трактуется как NUMBER(*, 0), т.е. 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

любая стоимость исполнения за счет преобразования? – Gyan

+1

Нет преобразования данных: 'DECIMAL' хранится и обрабатывается как' NUMBER'. –

+3

@ learn4living - Oracle не преобразовывает данные (значения хранятся в столбце), он преобразует метаданные (что хранится в словаре данных). Таким образом, единственная стоимость - это цена, которую вы сейчас платите: путаница среди практикующих Oracle, сталкивающихся с типами данных, отличными от Oracle. – APC

-2

Собственно, есть разница между десятичным числом и числом. Десятичный будет усекать значение, которое является чрезмерно масштабным, число будет округлено от значения.

+4

Я бы с удовольствием посмотрел на это. [Эта скрипка] (http://www.sqlfiddle.com/#!4/23fb7/1), по-видимому, указывает, что и NUMBER, и DECIMAL округляют значения масштаба. –

Смежные вопросы