【问题标题】:Delphi and ZEOS access components returning just a single record from Oracle databaseDelphi 和 ZEOS 访问组件只从 Oracle 数据库返回一条记录
【发布时间】:2023-02-18 04:11:48
【问题描述】:

我正在使用 Delphi 10.3 和 ZEOS 7.2.14 访问 Oracle 数据库。

我的一个查询只返回 1 条记录,而同一查询在 Oracle SQL Developer 中运行时返回很多行。

到目前为止,我已经使用子查询将问题缩小到 JOIN:

SELECT
    zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN TT_AP_MSCONS_RLM lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)

返回多行。在 JOIN 中使用简单的子查询:

SELECT
    zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN (
    SELECT
        MELDEPUNKT
    FROM TT_AP_MSCONS_RLM
) lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)

返回相同数量的记录。将 GROUP BY 添加到子查询:

SELECT
    zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN (
    SELECT
        MELDEPUNKT
    FROM TT_AP_MSCONS_RLM
    GROUP BY MELDEPUNKT
) lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)

还是返回了很多记录。但是当我像这样向子查询添加另一个字段时:

SELECT
    zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN (
    SELECT
        MELDEPUNKT,
        MAX(EMAIL_VERSAND_TIMESTAMP)
    FROM TT_AP_MSCONS_RLM
    GROUP BY MELDEPUNKT
) lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)

现在突然它只返回一行。在 Oracle SQL Developer 中运行最后一个查询会返回预期的大量行。

在使用 ZEOS 组件执行时和在 SQL Developer 中运行时,什么会使查询的工作方式不同?

【问题讨论】:

  • 请添加再现“只有一条记录”场景的 Delphi 代码。
  • 为了获得可更新的结果,一些额外的事情在幕后发生,这可能会导致某些查询出现类似的情况。尝试使用 TZReadOnlyQuery 而不是 TZQuery 来运行查询。
  • 我不知道 TZReadOnlyQuery。我更改了我的代码以在任何适用的地方使用它(像往常一样,这意味着大多数地方)并且问题已经消失了。谢谢你的提示,它在很多方面都比这个特殊的奇怪案例更有意义。如果我做到了,我会尝试用一个简单的测试用例进行重现,这样也许可以得出明确的答案。但现在我很高兴。

标签: oracle delphi zeos


【解决方案1】:

将我的 Oracle 数据库从版本 11g 升级到 19c 后,我遇到了同样的问题。在此更新之前,没有出现该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多