【问题标题】:Dynamically query Oracle table by date with Azure Data Factory使用 Azure 数据工厂按日期动态查询 Oracle 表
【发布时间】:2020-03-16 16:32:58
【问题描述】:

我正在使用 Azure 数据工厂 (v2) 创建从我们的本地 Oracle 数据库 到我们的 Azure Data Lake 的复制作业。理想情况下,此复制作业设置为增量加载,其中仅考虑最后一天的信息。

为此,我们要过滤列“load_time”,其格式为datetime,具有动态内容功能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”来设置日期时间限制。

【问题讨论】:

    标签: oracle azure-data-factory azure-data-factory-2


    【解决方案1】:

    看起来问题在于用于形成所需查询的动态表达式。

    请尝试在您的 ADF 管道活动中更新您的动态表达式,以形成有效的查询。

    我已经定义了一个名为 SingleQuotes 类型的字符串和 value = '(单引号)的管道参数 - 这是形成有效 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'"

    希望这会有所帮助。

    【讨论】:

    • 我是否正确理解您的解决方案,即需要 @CAST 将动态内容转换为字符串,以便 Oracle DB 理解查询?
    • 感谢您的帮助!我们能够继续并发现一个新错误,即:“ORA-01861:文字与格式字符串不匹配”。有这方面的线索吗?
    • 我们能够通过在 WHERE 语句中的“sales.load_time”周围使用 TO_CHAR 来解决错误。
    【解决方案2】:

    我相信正在使用的 ADDHOURS 来自 Oracle .Net C# function。它不是 Oracle 功能的一部分。您可以在模仿相同功能的 PL/SQL 中构建自己的函数,但更好的解决方案是重写 where 子句。类似的东西

    WHERE sales.load_time >= sysdate - interval '1' hour
    

    【讨论】:

    • ADDHOURS 是来自 Azure 动态内容 Documentation 的函数,我们正尝试在 Azure 数据工厂管道中使用它。
    猜你喜欢
    • 2019-07-31
    • 2021-07-22
    • 2020-12-11
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多