Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die Ergebnisse können nicht abgerufen werden, indem die Eingabe als XML-Pfad in Oracle übergeben wird

Angenommen, Sie versuchen, nach einer ID innerhalb des XML zu filtern, Sie haben ein Problem mit der Syntax, Sie haben den Stammknoten als ActivityId anstelle von Activity angegeben, Sie gehen nicht zum ID-Knoten hinunter, Sie verwenden contains - und das ist wahrscheinlich sowieso nicht das, was Sie wollen; und Sie ignorieren die Namespaces.

Dadurch werden nur Zeilen gefunden, in denen das XML eine bestimmte ID hat:

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;

Aber ExtractValue ist seit langem veraltet, daher sollten Sie stattdessen XMLQuery verwenden. Oder in diesem Zusammenhang wäre es wahrscheinlich sinnvoller, XMLExists zu verwenden, mit dem Wert, den Sie einbetten möchten:

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

oder vielleicht sinnvoller als Argument angegeben:

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

Wenn Sie dann bestimmte Daten aus dem XML in übereinstimmenden Zeilen extrahieren möchten, schauen Sie sich XMLQuery oder XMLTable an - aber das ist ein anderes Thema.