Невозможно извлечь значение XML из Oracle CBLOB - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь выбрать конкретное значение xml в качестве столбца в таблице Oracle 11G, которая хранится как XML - огромный CLOB, но не удается. Пожалуйста, помогите

Содержимое XML как ниже

<Bid xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/LCC.Crew.FAReserves.wsvc.Entities.FAReserves">
  <AggressiveBidType></AggressiveBidType>
  <BidCriteria>
    <BidCriteria i:type="RapBidCriteria">
      <Value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">BAC</Value>
    </BidCriteria>
  </BidCriteria>
  <BidItem>RAP</BidItem>
  <BidName>BAC</BidName>
  <BidType>Standing</BidType>
  <CatsId>10023</CatsId>
  <EmployeeBidId>10620</EmployeeBidId>
  <EmployeeId>135289</EmployeeId>
  <EndDate>2015-03-29T00:00:00Z</EndDate>
  <IsAggressive>false</IsAggressive>
  <IsLodo>false</IsLodo>
  <IsOnPremiseReserve>false</IsOnPremiseReserve>
  <OperatingDate>2015-02-25T00:00:00Z</OperatingDate>
  <Priority>0</Priority>
</Bid>

Ниже выписка вернет ноль

SELECT extract(XMLTYPE(XMLBIDCONTENT),'/Bid/BidName/text()') "REFERENCE"
  FROM  AOCREWBIDDING.EMPLOYEEBIDS
   Where EmployeeBidID = 100

Оператор ниже возвращает ошибку

ORA-00932: несовместимые типы данных: ожидаемые - полученные - 00932. 00000 - «несовместимые типы данных: ожидаемый% s получил% s» * Причина:
* Действие: Ошибка в строке: 83 столбец: 8

SELECT extract(XMLBIDCONTENT,'/Bid/BidName/text()').getStringVal() "REFERENCE"
  FROM  AOCREWBIDDING.EMPLOYEEBIDS
   Where EmployeeBidID = 100

1 Ответ

0 голосов
/ 05 июля 2018

Функция extract() устарела . Лучше использовать XMLQuery().

Вам необходимо либо объявить пространство имен по умолчанию, чтобы оно совпадало с пространством имен в документе XML:

select XMLQuery('
    declare default element namespace 
      "http://schemas.datacontract.org/2004/07/LCC.Crew.FAReserves.wsvc.Entities.FAReserves"; (: :)
    /Bid/BidName/text()'
  passing XMLType(xmlbidcontent)
  returning content) as BidName
from employeebids
where EmployeeBidID = 100;

BIDNAME                                                                         
--------------------------------------------------------------------------------
BAC

или (проще, но менее надежно) используйте подстановочный знак:

select XMLQuery('/*:Bid/*:BidName/text()'
  passing XMLType(xmlbidcontent)
  returning content) as BidName
from employeebids
where EmployeeBidID = 100;

BIDNAME                                                                         
--------------------------------------------------------------------------------
BAC

db <> fiddle , показывающий ваши исходные запросы и оба, с использованием CTE для предоставления образца значения CLOB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...