XMLQuery в Oracle для запроса XML

Я новичок в 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>[email protected]</PDEmail>
 </PDRecord>')
);

INSERT INTO person_data
(person_id, person_data)
VALUES
(2, XMLTYPE('
 <PDRecord>
   <PDName>Jack Cline</PDName>
   <PDDOB>5/17/1949</PDDOB>
   <PDEmail>[email protected]</PDEmail>
 </PDRecord>')
);

INSERT INTO person_data
(person_id, person_data)
VALUES
(3, XMLTYPE('
 <PDRecord>
   <PDName>Caleb Small</PDName>
   <PDDOB>1/1/1960</PDDOB>
   <PDEmail>[email protected]</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, пожалуйста, укажите мне на него.
Примечание: я уже ознакомился с документацией.


person redsoxlost    schedule 19.10.2019    source источник
comment
Извините, я не могу воспроизвести это с данными и запросом, которые вы предоставили. Я получаю ожидаемые результаты. (Я запускаю это на Oracle XE 18c.)   -  person Luke Woodward    schedule 19.10.2019
comment
@LukeWoodward Я запускал его на Live SQL от оракула.   -  person redsoxlost    schedule 20.10.2019


Ответы (1)


Я подозреваю, что то, что вы нажимаете, является ошибкой в ​​​​LiveSQL.

Если мы возьмем ваш запрос и завернем ваш вызов XMLQuery в NVL, который заменяет фиктивный документ в нулевом случае, мы получим лучший результат. Этот запрос успешно возвращается, подставляя фиктивный документ в случае, если условие не соответствует:

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 из приведенного выше запроса, вывод будет поврежден.

person Luke Woodward    schedule 20.10.2019