2015-04-29 3 views
1

Мое намерение состоит в том, чтобы «выбрать данные, где номер контейнера равен входным данным» (вид функции поиска). Я столкнулся вопрос, когда я пытаюсь получить данные, с проблемой при котором условие:получил последовательность нескольких элементов

d:goodsShipments/d:consignment/d:transportEquipment/d:id/text() 

Здесь я получаю множество данных. Я не знаю, как его повторить в условиях условия.

Мой запрос:

Мой источник XML является:

Как я могу выбрать все декларации, где sealId является 5678? как справиться с условиями условия в этом случае?

+0

Ваш образец XML не является полным или действительным. У вас есть '' с несогласованными пространствами имен; '' без закрывающего тега; он не имеет «декларации», «localReferenceNumber» и т. д .; другие части вашего запроса, похоже, не соответствуют структуре, которая есть. Трудно интерпретировать то, что вы делаете, с неправильной информацией. –

+0

Привет Алекс, добавил новый xml, который взят из базы данных – Ramesh

+0

ОК, я обновил свой ответ, чтобы использовать ваш образец; только реальное изменение: '/ c: declaration' становится'/d: declaration'. –

ответ

3

У вас есть несколько контейнеров на консигнацию, и вы фильтруете на основе LRN после извлечения из исходного XML; поэтому вам нужно использовать вложенные объекты XMLTable. Первый получает данные из декларации и извлекает консигнации в качестве суб-XMLType. Затем он передается во второй XMLTable, который извлекает информацию о контейнере.

SELECT x1.lrn, x1.username, x2.containerNumber 
FROM dmsimport_decl d 
CROSS JOIN XMLTable(
    XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx', 
    'http://www.xxxx.invalid/xxx/schema/common' AS "c", 
    'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' AS "d"), 
    '/d:declaration' 
    PASSING d.object_value 
    COLUMNS 
    lrn VARCHAR2(35 CHAR) 
     PATH 'c:declarationHeader/c:localReferenceNumber/text()', 
    username CHAR(25) 
     PATH 'c:declarationHeader/c:username/text()', 
    consignment XMLType 
     PATH 'd:goodsShipments/d:consignment' 
) x1 
CROSS JOIN XMLTable(
    XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx', 
    'http://www.xxxx.invalid/xxx/schema/common' AS "c", 
    'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' AS "d"), 
    '//d:transportEquipment' 
    PASSING x1.consignment 
    COLUMNS 
    containerNumber VARCHAR2(35 CHAR) 
     PATH 'd:id/text()' 
) x2 
WHERE x1.lrn = 'NLDMS111111150010950'; 

С вашим (обновленным) образцом XML, который производит:

LRN         USERNAME     CONTAINERNUMBER     
----------------------------------- ------------------------- ----------------------------------- 
NLDMS111111150010950    testSC testSC    abcd        
NLDMS111111150010950    testSC testSC    bcde        
NLDMS111111150010950    testSC testSC    cdef        
NLDMS111111150010950    testSC testSC    defg        
NLDMS111111150010950    testSC testSC    efgh        

Надеется, что это то, что вы хотите увидеть.

Quick SQL Fiddle demo.

Вы также можете использовать более сложный XPath, чтобы держать его в пределах одного XMLTable, но я думаю, что это яснее.

0

Вы можете использовать ниже запрос итерацию и получить идентификаторы из контейнера компонента ..

SELECT x1.lrn, x1.username, x2.containerNumber 
FROM dmsimport_decl d 
CROSS JOIN XMLTable(
    XMLNAMESPACES(DEFAULT 'http://www.SSSSSSS/dmsimport', 
    'http://www.SSSSSSScommon' AS "c", 
    'http://www.SSSSSSSS/dmsimport' AS "d"), 
    '/d:declaration' 
    PASSING d.object_value 
    COLUMNS 
    lrn VARCHAR2(35 CHAR) 
     PATH 'c:declarationHeader/c:localReferenceNumber/text()', 
    username CHAR(25) 
     PATH 'c:declarationHeader/c:username/text()', 
    containerComponent XMLType 
     PATH 'd:goodsShipments/d:goodsItems' 
) x1. 
CROSS JOIN XMLTable(
    XMLNAMESPACES(DEFAULT 'http://www.SSSSSSSSS/dmsimport', 
    'http://www.SSSSSS/common' AS "c", 
    'http://www.SSSSSSSS/dmsimport' AS "d"), 
    '//d:containerComponent' 
    PASSING x1.containerComponent 
    COLUMNS 
    containerNumber VARCHAR2(35 CHAR) 
     PATH 'd:id/text()' 
) x2 
WHERE x1.lrn = 'NL123456789160000464'; 

 Смежные вопросы

  • Нет связанных вопросов^_^