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

Impossibile estrarre i risultati passando l'input come percorso xml in Oracle

Supponendo che tu stia cercando di filtrare un ID all'interno dell'XML, hai un problema con la sintassi, hai fornito il nodo radice come ActivityId invece di Activity, non stai scendendo al nodo ID, stai usando contains - e probabilmente non è quello che vuoi comunque; e stai ignorando gli spazi dei nomi.

Questo troverà solo le righe in cui l'XML ha un ID specifico:

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;

Ma ExtractValue è stato a lungo deprecato, quindi dovresti usare invece XMLQuery. Oppure in questo contesto avrebbe probabilmente più senso usare XMLExists, con il valore che vuoi incorporare:

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

o forse più utilmente fornito come argomento:

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<>violino

Se poi desideri estrarre dati specifici dall'XML nelle righe corrispondenti, guarda XMLQuery o XMLTable, ma questo è un problema separato.