Warm tip: This article is reproduced from serverfault.com, please click

xml-如何将XMLTABLE(Oracle SQL)与属性名称结合使用

(xml - How to use XMLTABLE (Oracle SQL) in combination with attribute names)

发布于 2020-12-04 18:07:51

我正在查询包含XML的Oracle SQL表。

(简化的)XML结构如下:

<aggregate type="HeadAggregate">
  <entity type="Default" root="true" id="asdb7e9e-93324-43242d-b83a-f2d3202ed">
    <attribute name="ObjectName" multivalue="false">ExampleName</attribute>
    <attribute name="Subprocesses" multivalue="false">false</attribute>
    <attribute name="ObjectDesc" multivalue="false">Description</attribute>
  </entity>
<aggregate>

我想获取对象名称。因此,我编写了以下查询:

SELECT xt.*
FROM DATABASENAME.TABLENAME x,
       XMLTABLE('/aggregate/entity[@type = ''Default'']'
         PASSING XMLTYPE(x.DATA)
         COLUMNS 
           attribute_name  VARCHAR2(100)  PATH 'attribute[1]'
         ) xt

到现在为止还挺好。这样很好!我得到所需的输出。

但是,现在我想通过引用属性名称来替换PATH中的“ [1]”,以使我的脚本更加灵活。因此,我将脚本更改为:

SELECT xt.*
FROM DATABASENAME.TABLENAME x,
       XMLTABLE('/aggregate/entity[@type = ''Default'']'
         PASSING XMLTYPE(x.DATA)
         COLUMNS 
           attribute_name  VARCHAR2(100)  PATH 'attribute[@name = ''ObjectName'']'
         ) xt

由于某种原因,现在我收到以下错误消息:

00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:
Error at Line: 3 Column: 47

我已经为此苦苦挣扎了一段时间。我究竟做错了什么?

提前谢谢了!

Questioner
Hans Dolendam
Viewed
0
Alex Poole 2020-12-05 04:55:55

你可以(或应该)使用双引号,而不是转义的单引号:

SELECT xt.*
FROM DATABASENAME.TABLENAME x,
       XMLTABLE('/aggregate/entity[@type = "Default"]'
         PASSING XMLTYPE(x.DATA)
         COLUMNS 
           attribute_name  VARCHAR2(100)  PATH 'attribute[@name = "ObjectName"]'
         ) xt

db <>小提琴