2016-05-17 167 views
1

數字亞型(SMALLINT,INT等),我在甲骨文的Oracle增加了一個表的字段 -查找甲骨文

  • SMALLINT
  • INT
  • BIGINT

但它內部將它們存儲爲decimal(22,0)

有沒有什麼辦法可以獲得單個子類型(e。 G。 smallint)而不是十進制。

我用例:

我使用sqoop將數據從Oracle複製到蜂巢。我需要檢查oracle表的列的元數據並編寫自己的oracle來配置數據類型映射。

但是我總是得到decimal(22,0),所以我需要將所有這些列映射到hive表中的decimal(22,0),即使對於smallint。

+1

試圖在一個使用'BIGINT' 'CREATE TABLE'語句拋出一個異常'ORA-00902:無效的數據類型'。另外兩個似乎只是'NUMBER(38)'的別名。 – MT0

+0

我不認爲oracle在內部將它們存儲爲'decimal(22,0)'。這是在將這些列映射到外部之後獲得的數據類型。實際上'decimal'在內部也是一個子類型。 'BIGINT'不是oracle sql中的一個子類型。您可能需要考慮使用NUMBER(x,y)與(x,y)的較小值,而不是使用子類型。對於內置子類型,以下是[docs](https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm)中的列表。 – ruudvan

+0

@ MT0我不好使用松鼠檢查表中的數據,元數據。使用**創建表腳本**時,它顯示'decimal(22,0)',同時檢查表'precision'的元數據顯示爲38。我不知道爲什麼我得到這個差異(__我正在使用'ojdbc6.jar' for this_) –

回答

3

數據類型SMALLINTINT只是ANSI/ISO標準類型,其中在Oracle中,are aliases for NUMBER(38)BIGINT數據類型不存在。

如果要存儲2字節,4字節和8個字節的值,則可以使用適當的尺寸NUMBER列和約束檢查,以確保數據是所需要的範圍內的組合:

CREATE TABLE table_name (
    small NUMBER(5,0) CHECK (small BETWEEN -POWER(2,15) AND +POWER(2,15)-1), 
    medium NUMBER(10,0) CHECK (medium BETWEEN -POWER(2,31) AND +POWER(2,31)-1), 
    big NUMBER(19,0) CHECK (big BETWEEN -POWER(2,63) AND +POWER(2,63)-1) 
); 

INSERT INTO table_name VALUES (-POWER(2,15), -POWER(2,31), -POWER(2,63)); 
INSERT INTO table_name VALUES (POWER(2,15)-1, POWER(2,31)-1, POWER(2,63)-1); 

然後:

SELECT * FROM table_name 

輸出:

SMALL MEDIUM  BIG 
------ ----------- -------------------- 
-32768 -2147483648 -9223372036854775808 
32767 2147483647 9223372036854775807