sql >> Database teknologi >  >> RDS >> Oracle

Ude af stand til at trække resultaterne ved at sende input som xml-sti i oracle

Hvis du antager, at du forsøger at filtrere på et ID i XML, har du et problem med syntaks, du har leveret rodnoden som ActivityId i stedet for Activity, du går ikke ned til ID-noden, du misbruger contains - og det er vel alligevel ikke det, du ønsker; og du ignorerer navneområderne.

Dette vil kun finde rækker, hvor XML'en har et 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 længe været forældet, så du bør bruge XMLQuery i stedet. Eller i denne sammenhæng ville det nok give mere mening at bruge XMLExists med den værdi, du ønsker indlejret:

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 måske mere nyttigt leveret som et 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

Hvis du så vil udtrække specifikke data fra XML i matchende rækker, så se på XMLQuery eller XMLTable - men det er et separat problem.




  1. Sådan sikkerhedskopieres gemte procedurer i MySQL

  2. indsæt php-array i mySql

  3. SÅDAN HENTES DATA MELLEM 2 DATOER I ORACLE SQL UDVIKLER

  4. Opdater MySQL:java.sql.SQLEundtagelse:Ingen værdi angivet for parameter 8