微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle 表值函数在数据工厂中返回错误的小数

如何解决Oracle 表值函数在数据工厂中返回错误的小数

我正在使用 Azure 数据工厂 v2 开发云数据仓库。 我的很多数据源都是本地 Oracle 12g 数据库提取表 1-1 不是问题。 但是,有时我需要在我的复制活动中提取参数化计算生成的数据。

由于我不能在 ADF 中使用 PL/sql 存储过程作为源,我改为在源数据库中使用表值函数并在复制活动中查询它们。

在大多数情况下,这可以正常工作。但是,当我的表值函数返回十进制类型列时,ADF 有时会返回错误值。即:在源数据库上执行 TVF 并通过 ADF 预览/复制会产生不同的结果。

如果绝对值或十进制数的符号重要,我做了一些实验,但我找不到任何正确返回小数和不正确返回的模式。

以下是一些错误映射的数字示例:

Oracle 数据库中的值 ADF 中的值
-658388.5681 188344991.6319
-205668.1648 58835420.6352
10255676.84 188213627.97348
  1. 你们中有人遇到过类似的问题吗?
  2. 您是否知道这是否是 ADF 中的错误(首先它没有很好地与 PL/sql 集成)?

第一假设

起初我认为这个问题与 NLS、演员或类似的事情有关。 我通过在 Oracle db 端创建一个表来测试这个假设,将来自 TVF 的输出保存在那里,然后从 ADF 中的表中提取。 使用此方法,小数在 ADF 中正确返回。因此假设不成立。

第二个假设

这可能与用户访问有关。 但是,ADF 中使用的链接服务使用的数据库凭据与用于登录数据库以在那里执行 TVF 的凭据相同。

观察

当tvf的逻辑涉及很多聚合函数时,错误似乎更频繁发生

最小可重复示例

Oracle 数据库

CREATE OR REPLACE TYPE test_col AS OBJECT
(
dec_col NUMBER(20,5)
)
/

CREATE OR REPLACE TYPE test_tbl AS TABLE OF test_col;

create or replace function test_fct(param date) return test_tbl
AS
ret_tbl test_tbl;
begin
select
    test_col(
    <"some complex logic which return a decimal">
    )
 bulk collect into ret_tbl
 from <"some complex joins and group by's">;
 
 return ret_tbl;
end test_fct;

select dec_col from table(test_fct(sysdate));

自动进稿器: 数据集:

{
    "name": "test_dataset","properties": {
        "linkedServiceName": {
            "referenceName": "some_name","type": "LinkedServiceReference"
        },"folder": {
            "name": "some_name"
        },"annotations": [],"type": "OracleTable","structure": [
            {
                "name": "dec_col","type": "Decimal"
            }
        ]
    }
}

管道:

{
    "name": "pipeline1","properties": {
        "activities": [
            {
                "name": "copy data1","type": "copy","dependsOn": [],"policy": {
                    "timeout": "7.00:00:00","retry": 0,"retryIntervalInSeconds": 30,"secureOutput": false,"secureInput": false
                },"userProperties": [],"typeProperties": {
                    "source": {
                        "type": "OracleSource","oracleReaderQuery": "select * from table(test_fct(sysdate))","partitionoption": "None","queryTimeout": "02:00:00"
                    },"enableStaging": false
                },"inputs": [
                    {
                        "referenceName": "test_dataset","type": "DatasetReference"
                    }
                ]
            }
        ],"annotations": []
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。