Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não é possível extrair os resultados passando a entrada como caminho xml no oracle


Supondo que você esteja tentando filtrar um ID dentro do XML, você tem um problema com a sintaxe, você forneceu o nó raiz como ActivityId em vez de Activity, você não está indo para o nó ID, você está usando incorretamente contains - e isso provavelmente não é o que você quer de qualquer maneira; e você está ignorando os namespaces.

Isso só encontrará linhas em que o XML tenha um ID específico:
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;

Mas ExtractValue está obsoleto há muito tempo, então você deve usar XMLQuery. Ou, neste contexto, provavelmente faria mais sentido usar XMLExists, com o valor que você deseja incorporar:
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
);

ou talvez mais útil fornecido como um 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

Se você deseja extrair dados específicos do XML em linhas correspondentes, consulte XMLQuery ou XMLTable - mas isso é um problema separado.