我在oracle的oracle中添加了一个带有字段的表 -
但它在内部将它们存储为decimal(22,0)
有没有办法获得单个子类型(例如smallint )而不是小数。
我的用例:
我正在使用sqoop将数据从oracle复制到hive。我需要检查oracle表的列的元数据,并编写自己的oracle来进行数据类型映射。
但我总是得到decimal(22,0)
,所以我需要将所有这些列映射到hive表中的decimal(22,0)
,即使对于smallint也是如此。
答案 0 :(得分:6)
数据类型SMALLINT
和INT
只是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