【问题标题】:Using Azure Data Factory to import a column of type NUMBER in oracle results in a strange precision error在oracle中使用Azure数据工厂导入NUMBER类型的列会出现奇怪的精度错误
【发布时间】:2023-02-06 20:57:45
【问题描述】:

我们正在从 ORACLE 到 Azure 中的 SQL。

据我所知,我们必须使用管道和数据集,以及各种 COPY 操作。

似乎没有一种方法可以从 Oracle 导入数据并通过数据流对其进行操作,而无需先将其放入暂存数据库,即使这样对于这个问题也为时已晚。

问题是 oracle 中 NUMBER 类型的列的值可能为 1.1234 或 2.23423485

我将 SQL 数据类型设置为 DECIMAL(12, 8),这应该涵盖所有具有 COPY TABLE 操作的场景。

我试过将副本作为数字,甚至作为 varchar:

              {
                "source": {
                  "name": "MYDECIMALVALUE",
                  "type": "String"
                },
                "sink": {
                  "name": "MyDecimalValue",
                  "type": "String",
                  "physicalType": "varchar"
                }
              },

然而,上述两个数字的结果将是:

2.23423485 保持为 2.23423485

1.1234 变成 1.12340001

从 oracle 中提取 NUMBER 的一些奇怪的精度问题。

上面的配置设置为

              {
                "source": {
                  "name": "MYDECIMALVALUE",
                  "type": "Decimal"
                },
                "sink": {
                  "name": "MyDecimalValue",
                  "type": "Decimal",
                  "physicalType": "decimal",
                  "precision": 12,
                  "scale": 8,
                }
              },

有什么办法可以解决这个奇怪的怪癖吗?

【问题讨论】:

    标签: oracle azure-pipelines azure-sql-database azure-data-factory


    【解决方案1】:

    我还尝试重现您的场景,并且当我们在 SQL 表中已经给出 Decimal(p,s) 数据类型时也得到了类似的结果。

    DECIMAL(精度,小数位数)

    precision -- 小数点可以存储的最大位数。精度包括小数点的左边和右边。它接受 1 到 38 之间的值。默认值为 18。 scale -- 可选,指定小数点后的位数。比例必须在 0 到与精度相同的值之间。

    当你的场景缩放他的 8 并且来自 Oracal 的数字 Geeting 有缩放 4 所以 SQL 在数字的末尾添加 4 个零以获得所需的数据缩放,如下图所示:

    Decimal 具有固定精度,而 float 具有可变精度。为避免这种情况,可以解决在预复制脚本中将该数据类型更改为 float

    alter table MY_TABLE alter column MY_COLUMN float;
    

    输出:

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 2016-04-20
      • 2017-09-16
      • 2021-07-21
      • 2013-08-22
      • 2011-03-26
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多