我们的一个Oracle数据源有数百个表,其中所有数字列都使用NUMBER数据类型定义,没有精度和比例。但事实上,一列可以存储纯整数值或十进制值 - 没有办法通过单独查看数据类型来判断它。现在,这是一个很大的问题,因为当我尝试将任何这些数据加载到大数据工具(Sqoop,Hive,Spark等)时,所有这些工具都将这些列视为字符串,这是一个非常痛苦的问题。我认为这是所有基于JDBC / Java的工具的问题。
是否有可能以某种方式检测存储在NUMBER类型列中的值的实际精度和比例。我希望Oracle将其保存在元数据表中,但我没有看到任何地方。我最后的办法是对表中的数据进行随机抽样并存储转换模式,但我希望有更好的方法。我真的很喜欢
例如,表TEST
有三列,ID
,AMOUNT
和QUANTITY
都声明为NUMBER,未指定精度或比例。
但事实上ID
应该是一个bigint,AMOUNT
应该是十进制(18,6)而QUANTITY
应该是一个int。
create table test (
ID number,
AMOUNT number,
QTY number
)
ID AMOUNT QTY
1 200.56 4
2 23.754 5
我不可能手动进行映射,因为我有600个表,每个表有50-300列。数据采样是我最后的选择。
答案 0 :(得分:-1)
Oracle数字类型默认为38.0
答案 1 :(得分:-2)
要在创建SCALE
列时将PRECISION
和NUMBER
定义为ALL_TAB_COLUMNS
,您可以查询Oracle的数据字典视图USER_TAB_COLUMNS
或{ {1}}如果所有表都在同一模式下。
这些视图包含DATA_PRECISION
和DATA_SCALE
列中的信息。