sql >> Databasteknik >  >> RDS >> Oracle

fick en sekvens med flera objekt

Du har flera behållare per sändning och du filtrerar baserat på LRN efter att ha extraherat det från den råa XML; så du måste använda kapslade XMLTable-objekt. Den första hämtar data från deklarationen och extraherar sändningarna som en under-XMLTyp. Det skickas sedan till den andra XML-tabellen som extraherar behållarinformationen.

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';

Med ditt (uppdaterade) exempel på XML, som producerar:

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

Förhoppningsvis är det det du vill se.

Quick SQL Fiddle-demo .

Du kan också använda en mer komplicerad XPath för att hålla den i en enda XML-tabell, men jag tror att detta är tydligare.



  1. pgAgent-jobbet misslyckas med autentiseringsfel

  2. fråga för min första rad admin för aldrig radera

  3. MySQL Before Delete trigger för att undvika att radera flera rader

  4. Hur man bäst beräknar aggregeringsdata på n-nivå baserat på data på (n-1)-nivå (Oracle)