sql >> Databasteknik >  >> RDS >> Oracle

Det går inte att hämta resultaten genom att skicka indata som xml-sökväg i oracle

Förutsatt att du försöker filtrera på ett ID i XML, du har ett problem med syntax, du har angett rotnoden som ActivityId istället för Activity, du går inte ner till ID-noden, du missbrukar contains - och det är nog inte det du vill ändå; och du ignorerar namnområdena.

Detta kommer bara att hitta rader där XML har ett specifikt ID:

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;

Men ExtractValue har föråldrats sedan länge, så du bör använda XMLQuery istället. Eller i det här sammanhanget skulle det förmodligen vara mer meningsfullt att använda XMLExists, med det värde du vill ha inbäddat:

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

eller kanske mer användbart som ett 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<>fiol

Om du sedan vill extrahera specifik data från XML i matchande rader, titta på XMLQuery eller XMLTable - men det är en separat fråga.




  1. Inga dubbletter i SQL-fråga

  2. CREATE VIEW måste vara den enda satsen i batchen

  3. fylla en MySQL med en stor serie rader snabbt

  4. JDBC PreparedStatement resulterar i MySQL-syntaxfel