Bazujemy na tej tabeli co w poprzednim wpisie. W tabeli z kursami jest jeden wiersz zawierający w formacie XML kursy następujących walut (w kolejności ich występowania):
THB
USD
AUD
HKD
CAD
Napiszemy kilka prostych zapytań.
Wyświetlenie kodu waluty z pierwszego węzła:
SELECT EXTRACTVALUE(CXML,'//pozycja[1]/kod_waluty' ) FROM TBL_XML;
Wyświetlenie kodu waluty z pierwszego węzła:
SELECT EXTRACTVALUE(CXML,'//pozycja[1]/kod_waluty' ) FROM TBL_XML;
Wyświetlenie kodu waluty z pierwszego węzła
SELECT EXTRACTVALUE(CXML,'//pozycja[ last() ]/kod_waluty' ) FROM TBL_XML;
lub
SELECT EXTRACTVALUE(CXML,'//pozycja[ position() = last() ]/kod_waluty' ) FROM TBL_XML;
Uwaga: wielkość liter ścieżce XPath ma znaczenie. Następująca ścieżka ,'//pozycja[ Position() = last() ]/kod_waluty' jest już niepoprawna
Wyświetlenie kodu waluty z przedostatniego węzła:
SELECT EXTRACTVALUE(CXML,'//pozycja[ last() -1 ]/kod_waluty' ) FROM TBL_XML;
Wyświetlenie wszystkich kodów walut (przy założeniu, że procesujemy jeden wiersz) - czyli warto dodać odwołanie do klucza w tabeli. W klauzuli CONNECT BY LEVEL należy dodać sensowne górne oszacowanie liczby węzłów
SELECT EXTRACTVALUE(CXML,'//pozycja[' || LEVEL || ']/kod_waluty' ) FROM TBL_XML
WHERE EXTRACTVALUE(CXML,'//pozycja[' || LEVEL || ']/kod_waluty' ) IS NOT NULL AND CID = 1
CONNECT BY LEVEL < 100;
Wyświetlenie wszystkich kodów walut zawartych w węzłach od drugiego do przedostatniego
SELECT EXTRACTVALUE(CXML,'//pozycja[' || LEVEL || ']/kod_waluty' ) FROM TBL_XML WHERE EXTRACTVALUE(CXML,'//pozycja[ position() = ' || LEVEL || ' and position() >=2 and position() <= last() -1 ]/kod_waluty' ) IS NOT NULL AND CID = 1
CONNECT BY LEVEL < 100;
Policzenie ile wierszy w tabeli zawiera w polu CXML kod waluty dolara:
SELECT COUNT(*) FROM TBL_XM WHERE EXISTSNODE(CXML, '//pozycja[kod_waluty="USD"]') = 1;
wynik 1
Brak komentarzy:
Prześlij komentarz