2

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

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

在大多数情况下,这可以正常工作。但是,当我的表值函数返回十进制类型列时,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 的逻辑中涉及很多聚合函数时,错误似乎更频繁地发生

最小可重现示例

甲骨文数据库:

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));

ADF:数据集:

{
    "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": []
    }
}
4

0 回答 0