我正在使用 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 |
- 你们中有人遇到过类似的问题吗?
- 你知道这是否是 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": []
}
}