46

我使用 oracle 字典视图来找出两个模式之间的列差异(如果有的话)。在同步数据类型差异时,我发现 NUMBER 和 INTEGER 数据类型都存储在 all_tab_columns/user_tab_columns/dba_tab_columns 中,因此很难同步一个模式/列具有数字数据类型而另一个模式/列具有整数数据类型的数据类型差异.

在比较模式时,它显示数据类型不匹配。请建议是否有任何其他替代形式使用字典视图,或者是否可以使用字典视图中的任何特定属性来识别数据类型是否为整数。

4

3 回答 3

31

我发现的最好的解释是:

INTEGER 和 NUMBER 有什么区别?我们什么时候应该使用 NUMBER,什么时候应该使用 INTEGER?我只是想在这里更新我的评论......

NUMBER 总是在我们输入时存储。比例为 -84 到 127。但 INTEGER 会四舍五入为整数。INTEGER 的小数位数为 0。INTEGER 等价于 NUMBER(38,0)。这意味着,INTEGER 是受约束的数字。小数位将被四舍五入。但 NUMBER 不受限制。

  • 整数(12.2)=> 12
  • 整数(12.5)=> 13
  • 整数(12.9)=> 13
  • 整数(12.4) => 12
  • 数字(12.2)=> 12.2
  • 数字(12.5)=> 12.5
  • 数字(12.9)=> 12.9
  • 数字(12.4)=> 12.4

INTEGER 总是比 NUMBER 慢。由于整数是一个带有附加约束的数字。强制执行约束需要额外的 CPU 周期。我从来没有看到任何差异,但是当我们在 INTEGER 列上加载数百万条记录时可能会有差异。如果我们需要确保输入是整数,那么 INTEGER 是最好的选择。否则,我们可以坚持使用 NUMBER 数据类型。

这是链接

于 2014-05-28T15:51:19.760 回答
24

整数仅适用于 sql 标准,即被 Oracle 弃用。

您应该改用数字。

无论如何,Oracle 在幕后将整数存储为 Number。

最常见的是,当为 ID 存储整数时,它们是在没有参数的情况下定义的——所以理论上你可以查看元数据视图的比例和精度列,看看是否可以存储十进制值——但是 99% 的时间是这样的不会有帮助的。

正如上面评论的那样,您可以查找 number(38,0) 列或类似的列(即不允许小数点的列),但这只会告诉您哪些列不能带小数,而不是定义了哪些列以便可以存储 INTS .

建议:对数字列进行数据分析。像这样的东西:

 select max( case when trunc(column_name,0)=column_name then 0 else 1 end ) as has_dec_vals
 from table_name
于 2013-09-06T00:11:34.917 回答
12

这是我从oracle 文档中得到的,但它适用于 oracle 10g 第 2 版:

当您定义一个 NUMBER 变量时,您可以指定它的精度 (p) 和比例 (s),以便它足够大,但不是不必要的大。精度是有效位数。规模可以是正的或负的。正刻度标识小数点右边的位数;负数表示小数点左侧可以向上或向下舍入的位数。

Oracle 数据库标准库支持NUMBER数据类型,其运行方式与 SQL 中的相同。当文本或INTEGER数据类型不合适时,它用于维度和代理项。它通常分配给不用于计算的变量(如预测和聚合),并且用于必须匹配数据库的舍入行为或需要高精度的变量。在决定是否将 NUMBER 数据类型分配给变量时,请记住以下事实以最大限度地提高性能

  • NUMBER 变量的分析工作区计算比其他数值数据类型慢,因为 NUMBER 值是在软件中计算的(为了准确性)而不是在硬件中(为了速度)。
  • 将数据从分析工作区提取到具有 NUMBER 数据类型的关系列时,如果数据在分析工作区中已经具有 NUMBER 数据类型,则性能最佳,因为不需要转换步骤。
于 2013-11-13T10:37:46.640 回答