使用 Azure 数据工厂按日期动态查询 Oracle table
Dynamically query Oracle table by date with Azure Data Factory
我正在使用 Azure 数据工厂 (v2) 从我们的本地 Oracle 数据库 创建一个复制作业到我们的 Azure 数据湖。理想情况下,此复制作业设置为增量加载,其中仅考虑最后一天的信息。
为此,我们要过滤格式为 datetime 的列“load_time”,具有 Azure 数据工厂的动态内容 功能。
虚拟查询将是:
SELECT sales.* FROM schema.sales sales WHERE sales.load_time >= {everything from one hour ago}
当用动态内容丰富这个查询时,我们有类似
的东西
SELECT sales.* FROM schema.sales sales WHERE sales.load_time >= addHours(utcnow(), -1, format='yyyy-MM-dd HH:mm:ss')
但是,我们继续运行进入错误:
ORA-00904:"ADDHOURS": invalid identifier
有没有人对这里出了什么问题有任何经验/见解?
谢谢
EDIT-1:我们的目标是使用 the Dynamic Content in Azure Data Factory 中的表达式,例如“addHours”来设置日期时间限制。
我相信正在使用的 ADDHOURS 来自 Oracle .Net C# function。它不是 Oracle 函数的一部分。您可以在 PL/SQL 中构建自己的函数,它模仿相同的函数,但更好的解决方案是重写 where 子句。像
WHERE sales.load_time >= sysdate - interval '1' hour
看起来问题出在用于形成所需查询的动态表达式上。
请尝试在您的 ADF 管道中更新您的动态表达式 activity 以形成有效的查询。
我已经定义了一个名为 SingleQuotes 的管道参数,类型为字符串和值 = '(单引号)- 这是形成有效 where 条件所必需的,例如 "WHERE sales.load_time >='2020-03-16 20:04:04'
"
动态表达式:
@concat('SELECT sales.* FROM schema.sales sales WHERE sales.load_time >=', pipeline().parameters.singleQuotes, formatDateTime(addHours(utcnow(), -1), 'yyyy-MM-dd HH:mm:ss'), pipeline().parameters.singleQuotes)
此动态表达式将生成一个 SQL 查询,如下所示:(我已在 T-SQL 中尝试过)
"sqlReaderQuery":“SELECT sales.* FROM schema.sales sales WHERE sales.load_time >='2020-03-16 20:04:04'
”
希望对您有所帮助。
我正在使用 Azure 数据工厂 (v2) 从我们的本地 Oracle 数据库 创建一个复制作业到我们的 Azure 数据湖。理想情况下,此复制作业设置为增量加载,其中仅考虑最后一天的信息。
为此,我们要过滤格式为 datetime 的列“load_time”,具有 Azure 数据工厂的动态内容 功能。
虚拟查询将是:
SELECT sales.* FROM schema.sales sales WHERE sales.load_time >= {everything from one hour ago}
当用动态内容丰富这个查询时,我们有类似
的东西SELECT sales.* FROM schema.sales sales WHERE sales.load_time >= addHours(utcnow(), -1, format='yyyy-MM-dd HH:mm:ss')
但是,我们继续运行进入错误:
ORA-00904:"ADDHOURS": invalid identifier
有没有人对这里出了什么问题有任何经验/见解?
谢谢
EDIT-1:我们的目标是使用 the Dynamic Content in Azure Data Factory 中的表达式,例如“addHours”来设置日期时间限制。
我相信正在使用的 ADDHOURS 来自 Oracle .Net C# function。它不是 Oracle 函数的一部分。您可以在 PL/SQL 中构建自己的函数,它模仿相同的函数,但更好的解决方案是重写 where 子句。像
WHERE sales.load_time >= sysdate - interval '1' hour
看起来问题出在用于形成所需查询的动态表达式上。
请尝试在您的 ADF 管道中更新您的动态表达式 activity 以形成有效的查询。
我已经定义了一个名为 SingleQuotes 的管道参数,类型为字符串和值 = '(单引号)- 这是形成有效 where 条件所必需的,例如 "WHERE sales.load_time >='2020-03-16 20:04:04'
"
动态表达式:
@concat('SELECT sales.* FROM schema.sales sales WHERE sales.load_time >=', pipeline().parameters.singleQuotes, formatDateTime(addHours(utcnow(), -1), 'yyyy-MM-dd HH:mm:ss'), pipeline().parameters.singleQuotes)
此动态表达式将生成一个 SQL 查询,如下所示:(我已在 T-SQL 中尝试过)
"sqlReaderQuery":“SELECT sales.* FROM schema.sales sales WHERE sales.load_time >='2020-03-16 20:04:04'
”
希望对您有所帮助。