Неправильный XPath в методе extractValue для PLSQL

Вопрос: Может кто-то помочь мне исправить утверждение XPath, которое входит в инструкцию SQL (Oracle), чтобы извлечь цену модели из XML ниже, чье имя является "Браво" и чье имя модели "XYZ789": Acme ABC123 $350.00 Bravo XYZ789 $250.00 GHI456 $300.00 Вышеупомянутый XML-Clob

Вопрос:

Может кто-то помочь мне исправить утверждение XPath, которое входит в инструкцию SQL (Oracle), чтобы извлечь цену модели из XML ниже, чье имя <BrandName> является “Браво” и чье имя модели “XYZ789”:

<CarDetails> <Wheels> <Rims> <BrandName>Acme</BrandName> <Model> <Name>ABC123</Name> <Price>$350.00</Price> </Model> </Rims> <Rims> <BrandName>Bravo</BrandName> <Model> <Name>XYZ789</Name> <Price>$250.00</Price> </Model> <Model> <Name>GHI456</Name> <Price>$300.00</Price> </Model> </Rims> </Wheels> </CarDetails>

Вышеупомянутый XML-Clob хранится в таблице Oracle под названием Cars, в которой есть столбцы под названием “id”, “version” и “xml_document”.

Моя инструкция SQL для извлечения необходимой мне информации выглядит следующим образом:

SELECT * FROM ( SELECT x.xml_document.GetClobVal() FROM Cars x WHERE extractValue(x.xml_document, ‘/a:CarDetails/b:Wheels/b:Rims[b:BrandName=»Bravo»]/b:Model/b:Name’, ‘xmlns:a=»cars:instance:3_1″ xmlns:b=»cars:conceptualcomponent:3_1″‘ ) in (‘XYZ789’) ORDER BY x.id, x.version ) where ROWNUM <= 100

… но он вообще не выводит какую-либо информацию. Он должен вытащить одну запись. Я точно знаю, что данные существуют в XML, и что это утверждение работает, когда я изменяю XPath внутри вызова extractValue чтобы получить другие значения, поэтому ясно, что XPath в моем SQL неверен.

/a:CarDetails/b:Wheels/b:Rims[b:BrandName=»Bravo»]/b:Model/b:Name

Может ли кто-нибудь предложить какие-либо предложения относительно того, как должна выглядеть команда XPath моего SQL extractValue?

Заранее спасибо.

Лучший ответ:

Если вам нужна цена автомобиля, чье фирменное наименование “Браво” и чье имя модели “XYZ789”, то следующий XPath должен получить его:

/a:CarDetails/b:Wheels/b:Rims[b:BrandName=»Bravo»]/b:Model[b:Name=»XYZ789″]/b:Price

Фактически, вот оно, в действии:

SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_xml_string VARCHAR2(4000) := ‘<a:CarDetails xmlns:a=»cars:instance:3_1″> 3 <b:Wheels xmlns:b=»cars:conceptualcomponent:3_1″> 4 <b:Rims> 5 <b:BrandName>Acme</b:BrandName> 6 <b:Model> 7 <b:Name>ABC123</b:Name> 8 <b:Price>$350.00</b:Price> 9 </b:Model> 10 11 </b:Rims> 12 <b:Rims> 13 <b:BrandName>Bravo</b:BrandName> 14 <b:Model> 15 <b:Name>XYZ789</b:Name> 16 <b:Price>$250.00</b:Price> 17 </b:Model> 18 <b:Model> 19 <b:Name>GHI456</b:Name> 20 <b:Price>$300.00</b:Price> 21 </b:Model> 22 </b:Rims> 23 </b:Wheels> 24 </a:CarDetails>’; 25 v_result VARCHAR2(4000); 26 BEGIN 27 SELECT extractValue(XMLTYPE(v_xml_string), 28 ‘/a:CarDetails/b:Wheels/b:Rims[b:BrandName=»Bravo»]/b:Model[b:Name=»XYZ789″]/b:Price’, 29 ‘xmlns:a=»cars:instance:3_1″ xmlns:b=»cars:conceptualcomponent:3_1″‘ 30 ) INTO v_result FROM DUAL; 31 32 dbms_output.put_line(v_result); 33 END; 34 / $250.00 PL/SQL procedure successfully completed. SQL>

Когда я попытался запустить XPath на вашем XML (после добавления им пространств имён a и b), я получил сообщение об ошибке “ORA-19025: EXTRACTVALUE возвращает значение только одного узла”. Это связано с тем, что EXTRACTVALUE может обрабатывать XPath только один результирующий узел. В вашем XML есть два узла, которые соответствуют вашему XPath: два элемента <Name> с содержимым XYZ789 и GHI456.

Ответ №1

в вашем заявлении extractvalue вы объявляете пространства имен, пока они не существуют в ваших xml-данных (по крайней мере, в том фрагменте, который вы опубликовали). либо удалите пространства имен и локальные имена из оператора extractvalue, либо добавьте их в xml в свой db.

Оцените статью
Добавить комментарий