sql >> Database >  >> RDS >> Oracle

Kan de resultaten niet ophalen door invoer door te geven als xml-pad in oracle

Ervan uitgaande dat je probeert te filteren op een ID in de XML, je hebt een probleem met de syntaxis, je hebt het hoofdknooppunt opgegeven als ActivityId in plaats van Activity, je gaat niet naar het ID-knooppunt, je misbruikt contains - en dat is waarschijnlijk toch niet wat je wilt; en je negeert de naamruimten.

Dit zal alleen rijen vinden waar de XML een specifieke ID heeft:

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;

Maar ExtractValue is al lang verouderd, dus u moet in plaats daarvan XMLQuery gebruiken. Of in deze context zou het waarschijnlijk logischer zijn om XMLExists te gebruiken, met de waarde die u wilt insluiten:

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

of misschien nuttiger geleverd als argument:

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

Als u vervolgens specifieke gegevens uit de XML wilt extraheren in overeenkomende rijen, kijk dan naar XMLQuery of XMLTable - maar dat is een andere kwestie.




  1. MySQL-pad ophalen in opdrachtprompt

  2. Hoe het aantal keren te tellen dat twee waarden in willekeurige volgorde in twee kolommen worden weergegeven

  3. Hoe gebruik je XPath met een variabele in Oracle XMLTable?

  4. Bestandsopslag voor webtoepassingen:bestandssysteem versus DB versus NoSQL-engines