sql >> Base de Datos >  >> RDS >> Oracle

tiene una secuencia de varios elementos

Tiene varios contenedores por envío y está filtrando según el LRN después de extraerlo del XML sin procesar; por lo que necesita usar objetos XMLTable anidados. El primero obtiene los datos de la declaración y extrae los envíos como un sub-XMLType. Luego se pasa a la segunda XMLTable que extrae la información del contenedor.

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

Con su XML de muestra (actualizado), eso produce:

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

Con suerte, eso es lo que quieres ver.

Demostración rápida de SQL Fiddle .

También podría usar un XPath más complicado para mantenerlo dentro de una única XMLTable, pero creo que esto es más claro.