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

No se pueden extraer los resultados al pasar la entrada como ruta xml en Oracle

Suponiendo que está tratando de filtrar una ID dentro del XML, tiene un problema con la sintaxis, ha proporcionado el nodo raíz como ActivityId en lugar de Actividad, no va al nodo de ID, está haciendo un mal uso de contains - y eso probablemente no es lo que quieres de todos modos; y estás ignorando los espacios de nombres.

Esto solo encontrará filas donde el XML tiene una ID específica:

SELECT * from activity
where ExtractValue(xml,
  '/Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID/text()',
  'xmlns="urn:astrazeneca:na:Activity:domain:3" xmlns:ns2="urn:astrazeneca:na:CommonTypes:domain:2"'
  ) = 10669;

Pero ExtractValue ha quedado obsoleto durante mucho tiempo, por lo que debe usar XMLQuery en su lugar. O en este contexto, probablemente tendría más sentido usar XMLExists, con el valor que desea incrustar:

SELECT * from activity
where XMLExists('
    declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
    declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
    /Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=10669]
  '
  passing xml
);

o tal vez más útil como argumento:

SELECT * from activity
where XMLExists('
    declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
    declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
    /Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=$id]
  '
  passing xml, 10669 as "id"
);

db<>fiddle

Si luego desea extraer datos específicos del XML en filas coincidentes, mire XMLQuery o XMLTable, pero eso es un tema aparte.