извлечение xmltype в pl/sql

Я новичок в pl/sql, и чтобы начать работать с xmltype, я следовал этому примеру на https://docs.oracle.com/cd/B10501_01/appdev.920/a96616/arxml24.htm

Это выглядит так

CREATE TABLE Xml_tab ( xmlval xmltype);

INSERT INTO Xml_tab VALUES (
xmltype('<?xml version="1.0"?>
           <EMP>
              <EMPNO>221</EMPNO>
              <ENAME>John</ENAME>
           </EMP>'));

INSERT INTO Xml_tab VALUES (
xmltype('<?xml version="1.0"?>
           <PO>
              <PONO>331</PONO>
              <PONAME>PO_1</PONAME>
           </PO>'));

-- now extract the numerical values for the employee numbers

SELECT e.xmlval.extract('//EMPNO/text()').getNumVal() as empno
    FROM Xml_tab 
    WHERE e.xmlval.existsnode('/EMP/EMPNO')  = 1;

Когда я могу создать таблицу и вставить в нее строки. Но когда я пытаюсь запустить последнюю процедуру, я получаю ORA-22950: cannot ORDER objects without MAP or ORDER method

Почему это происходит? Заранее спасибо.


person lidjan1    schedule 21.03.2018    source источник


Ответы (1)


Я не знаю, чего именно вы пытались достичь, но вот как можно использовать функции EXTRACT и EXISTSNODE для получения числовых значений для номеров сотрудников - EMPNO

SELECT extract(xmlval,'/EMP/EMPNO/text()').getNumberVal() as empno
    FROM Xml_tab WHERE
    existsnode(xmlval,'/EMP/EMPNO')  = 1 ;

Демо

person Kaushik Nayak    schedule 21.03.2018
comment
Спасибо за ответ. К сожалению, когда я пробую ваш код, я получаю Only LOB or String Storage is supported in Thin XMLType. И я исправил ссылку - person lidjan1; 21.03.2018
comment
@ lidjan1: Кажется, у меня это работает, как я показал вам в демоверсии. Кажется, вы скрываете какую-то часть своего кода. И ссылка, которую вы имеете в виду на Oracle9i. Какую версию Oracle вы используете? - person Kaushik Nayak; 21.03.2018
comment
попробуйте это: извлечь (xmlval,'/EMP/EMPNO/text()').getNumberVal() как empno - person hekko; 21.03.2018
comment
@hekko: Спасибо. Я включил это. - person Kaushik Nayak; 21.03.2018
comment
@Kaushik Nayak Я верю, что использую 11g. Это бы многое объяснило. - person lidjan1; 21.03.2018
comment
@lidjan1: Вот почему я попросил вас показать полный код, потому что сообщение об ошибке, которое вы разместили в вопросе, не коррелирует с запросом. Кроме того, прочитайте: stackoverflow.com/help/someone-answers - person Kaushik Nayak; 21.03.2018
comment
я думаю, что в документах есть опечатка: таблица без псевдонима e и getNumVal() должны читать getNumberVal() даже для 9i. Также работает: SELECT e.xmlval.extract('//EMPNO/text()').getNumberVal() as empno FROM Xml_tab e WHERE e.xmlval.existsnode('/EMP/EMPNO') = 1; - person hekko; 21.03.2018