Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Nie można pobrać wyników, przekazując dane wejściowe jako ścieżkę xml w oracle

Zakładając, że próbujesz filtrować według identyfikatora w XML, masz problem ze składnią, podałeś węzeł główny jako ActivityId zamiast Activity, nie schodzisz do węzła ID, niewłaściwie używasz contains - i to prawdopodobnie nie jest to, czego chcesz; i ignorujesz przestrzenie nazw.

Spowoduje to znalezienie tylko wierszy, w których kod XML ma określony identyfikator:

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;

Ale ExtractValue od dawna jest przestarzałe, więc zamiast tego powinieneś używać XMLQuery. Lub w tym kontekście prawdopodobnie bardziej sensowne byłoby użycie XMLExists z wartością, którą chcesz osadzić:

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

a może bardziej użytecznie jako 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<>skrzypce

Jeśli chcesz następnie wyodrębnić określone dane z XML w pasujących wierszach, spójrz na XMLQuery lub XMLTable - ale to osobna kwestia.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zduplikowany wiersz Oracle N razy, gdzie N jest kolumną

  2. Dlaczego otrzymuję następującą funkcję LISTAGG błędu:„wynik konkatenacji ciągów jest za długi?*

  3. Doradca ds. kompresji 11gR2 =Zło

  4. Czy „Wybierz” zawsze porządkuje według klucza podstawowego?

  5. Alternatywy dla LIMIT i OFFSET dla stronicowania w Oracle