0

我是 XLQuery 的新手,正在尝试一个基本命令-

CREATE TABLE person_data (
person_id   NUMBER(3),
person_data XMLTYPE
);

INSERT INTO person_data
(person_id, person_data)
VALUES
(1, XMLTYPE('
 <PDRecord>
   <PDName>Daniel Morgan</PDName>
   <PDDOB>12/1/1951</PDDOB>
   <PDEmail>damorgan@u.washington.edu</PDEmail>
 </PDRecord>')
);

INSERT INTO person_data
(person_id, person_data)
VALUES
(2, XMLTYPE('
 <PDRecord>
   <PDName>Jack Cline</PDName>
   <PDDOB>5/17/1949</PDDOB>
   <PDEmail>damorgan@u.washington.edu</PDEmail>
 </PDRecord>')
);

INSERT INTO person_data
(person_id, person_data)
VALUES
(3, XMLTYPE('
 <PDRecord>
   <PDName>Caleb Small</PDName>
   <PDDOB>1/1/1960</PDDOB>
   <PDEmail>damorgan@u.washington.edu</PDEmail>
 </PDRecord>')
);

我试过的...

select person_id,
       XMLQuery('for $i  in /PDRecord where $i/PDName = "Jack Cline" order by $i/PDName return $i/PDName'
       passing by value t.person_data
       returning CONTENT ) XMLData
from person_data t;

但它因错误而失败

ORA-30625: 不允许对 NULL SELF 参数进行方法调度

无法理解为什么?另外,如果您知道一些很好的 XMlQuery 教程,请指出这一点。
注意:我已经阅读了文档。

4

1 回答 1

1

我怀疑您遇到的是 LiveSQL 中的错误。

如果我们接受您的查询并将您的调用包装XMLQuery在一个NVL在 null 情况下替换虚拟文档的方法中,我们会得到更好的输出。此查询成功返回,在条件不匹配的情况下替换为虚拟文档:

select person_id,
       NVL(XMLQuery('for $i in /PDRecord where $i/PDName = "Jack Cline" order by $i/PDName return $i/PDName'
       passing by value t.person_data
       RETURNING CONTENT), XMLTYPE('<empty/>')) XMLData
from person_data t;

LiveSQL 中似乎还有其他错误:如果您将XMLData列别名从上面的查询中移开,则输出会损坏。

于 2019-10-20T19:23:23.943 回答