Извлечение XML данных с использованием SQL - PullRequest
0 голосов
/ 22 марта 2020

Я хотел бы иметь возможность извлекать определенные c данные из типа XML, используя Oracle в моем примере для клиента по имени "Аршад Али"

Это мои xml данные было вставлено:

  <Customers>
    <Customer CustomerName="Arshad Ali" CustomerID="C001">
      <Orders>
        <Order OrderDate="2012-07-04T00:00:00" OrderID="10248">
          <OrderDetail Quantity="5" ProductID="10" />
          <OrderDetail Quantity="12" ProductID="11" />
          <OrderDetail Quantity="10" ProductID="42" />
        </Order>
      </Orders>
      <Address> Address line 1, 2, 3</Address>
    </Customer>
    <Customer CustomerName="Paul Henriot" CustomerID="C002">
      <Orders>
        <Order OrderDate="2011-07-04T00:00:00" OrderID="10245">
          <OrderDetail Quantity="12" ProductID="11" />
          <OrderDetail Quantity="10" ProductID="42" />
        </Order>
      </Orders>
      <Address> Address line 5, 6, 7</Address>
    </Customer>
    <Customer CustomerName="Carlos Gonzlez" CustomerID="C003">
      <Orders>
        <Order OrderDate="2012-08-16T00:00:00" OrderID="10283">
          <OrderDetail Quantity="3" ProductID="72" />
        </Order>
      </Orders>
      <Address> Address line 1, 4, 5</Address>
    </Customer>
  </Customers>
</ROOT>

с использованием get clob Мне удалось извлечь всех клиентов.

Интересно, может ли кто-нибудь помочь мне извлечь данные для определенного c клиента ... Попытка использовать следующее, но безуспешно

SELECT extract(OBJECT_VALUE, '/root/Customers') "customer"
  FROM mytable2
  WHERE existsNode(OBJECT_VALUE, '/customers[CustomerName="Arshad Ali" CustomerID="C001"]')
        = 1;  

1 Ответ

2 голосов
/ 22 марта 2020

Регистр и точные имена узлов XML имеют значение:

SELECT extract(OBJECT_VALUE,
  '/ROOT/Customers/Customer[@CustomerName="Arshad Ali"][@CustomerID="C001"]') "customer"
FROM mytable2
WHERE existsnode (OBJECT_VALUE,
  '/ROOT/Customers/Customer[@CustomerName="Arshad Ali"][@CustomerID="C001"]') = 1

db <> fiddle

Если вы хотите искать только по имени, тогда используйте только этот атрибут:

SELECT extract(OBJECT_VALUE,
  '/ROOT/Customers/Customer[@CustomerName="Arshad Ali"]') "customer"
FROM mytable2
WHERE existsnode (OBJECT_VALUE,
  '/ROOT/Customers/Customer[@CustomerName="Arshad Ali"]') = 1

Но extract() и existsnode() устарели; используйте xmlquery() и xmlexists() вместо:

SELECT xmlquery('/ROOT/Customers/Customer[@CustomerName="Arshad Ali"][@CustomerID="C001"]'
  passing object_value
  returning content) "customer"
FROM mytable2
WHERE xmlexists('/ROOT/Customers/Customer[@CustomerName="Arshad Ali"][@CustomerID="C001"]'
  passing object_value)

дБ <> скрипка

...