【问题标题】:ORA-00979 Not a GROUP BY Expression with complex EXTRACTVALUEORA-00979 不是具有复杂 EXTRACTVALUE 的 GROUP BY 表达式
【发布时间】:2020-05-21 20:40:05
【问题描述】:

我正在尝试对具有 XMLTYPE 列的表执行一个相当简单的 Oracle 查询:

Select POB_CODPOL, CODSIS From (
    Select T1.POB_CODPOL, EXTRACTVALUE(T1.POB_XMLPOL, '/Polbas/polfun[nomfun="filterBySystem"]/extpar[codele="codsis"]/valele/text()') CODSIS 
    From TDTX_POLITICA_CLOB T1
    Where T1.POB_CODEMP = '001840' 
)     
Group By POB_CODPOL, CODSIS

这会引发ORA-00979 Not a GROUP BY Expression,我不太明白。 更糟糕的是:当我执行完全相同的查询,但使用简化的 XPATH 查询确实工作:

Select POB_CODPOL, CODSIS From (
    Select T1.POB_CODPOL, EXTRACTVALUE(T1.POB_XMLPOL, 'Polbas/codpol/text()') CODSIS 
    From TDTX_POLITICA_CLOB T1
    Where T1.POB_CODEMP = '001840' 
)     
Group By POB_CODPOL, CODSIS

看起来 Oracle 在使用 GROUP BY 时不喜欢 [nomfun="filterBySystem"] 之类的条件(没有分组子句,一切正常)。

知道为什么会发生这种情况吗?

编辑:内部查询的结果相当简单:

【问题讨论】:

  • 内部查询(没有分组依据)的结果是什么?
  • 这是一个简单的三字符文本。我已经用更多信息更新了这个问题。谢谢!
  • 将其转换为字符串时是否有效,例如CAST(EXTRACTVALUE(T1.POB_XMLPOL, 'Polbas/codpol/text()') AS VARHCAR2(100)
  • 不,已经试过了。不适用于 CAST,也不适用于 TO_CHAR 之类的东西。
  • EXTRACTVALUE 已弃用。与XMLTABLE 一起使用是否更好,类似于SELECT T1.POB_CODPOL, x.CODSIS FROM TDTX_POLITICA_CLOB T1 NATURAL JOIN XMLTABLE('/Polbas/polfun[nomfun="filterBySystem"]/extpar[codele="codsis"]/valele' PASSING POB_XMLPOL COLUMNS CODSIS VARCHAR2(50) PATH '/') x

标签: oracle xpath group-by


【解决方案1】:

EXTRACTVALUE 已弃用。

Oracle 建议使用XMLQUERY、XMLTABLE。

这个应该可以的:

WITH t as
    (SELECT T1.POB_CODPOL, x.CODSIS 
     FROM TDTX_POLITICA_CLOB T1 
          NATURAL JOIN XMLTABLE('/Polbas/polfun[nomfun="filterBySystem"]/extpar[codele="codsis"]/valele‌​' 
             PASSING POB_XMLPOL COLUMNS 
             CODSIS VARCHAR2(50) PATH '/') x
     Where T1.POB_CODEMP = '001840')
SELECT POB_CODPOL, CODSIS 
FROM t
GROUP BY POB_CODPOL, CODSIS;

【讨论】:

    【解决方案2】:

    当表格式为二进制 XML 时,存在错误 28588011:“ORA-00979: NOT A GROUP BY EXPRESSION”。

    Severity    2 - Severe Loss of Service
    Created 02-Sep-2018
    Status  11 - Code/Hardware Bug (Response/Resolution)
    WORKAROUND No
    

    我猜他们不会修复它。但是提示 NO_XML_QUERY_REWRITE(我也用于其他与 XML 相关的错误)对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 2011-04-24
      • 2011-06-04
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多