问题描述
我正在使用 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 |
第一假设
起初我认为这个问题与 NLS、演员或类似的事情有关。 我通过在 Oracle db 端创建一个表来测试这个假设,将来自 TVF 的输出保存在那里,然后从 ADF 中的表中提取。 使用此方法,小数在 ADF 中正确返回。因此假设不成立。
第二个假设
这可能与用户访问有关。 但是,ADF 中使用的链接服务使用的数据库凭据与用于登录数据库以在那里执行 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 (将#修改为@)