- nazwa_waluty
- przelicznik
- kod_waluty
- kurs sredni
dolar amerykański
Poznamy teraz konstrukcji, która w w elegancki sposób będzie pokazywać elementy i atrybuty z powtarzających się elementówSELECT EXTRACTVALUE( x.cxml, '//data_publikacji') data_pubblikacji ,
EXTRACTVALUE( x.cxml, '//numer_tabeli') nr_tabeli ,
xt.*
FROM TBL_XML x,
XMLTABLE('//pozycja'
PASSING x.cxml --nazwa_kolumny XML
COLUMNS
NAZWA_WALUTY VARCHAR2(30 CHAR) PATH 'nazwa_waluty',
KOD_WALUTY VARCHAR2(3 CHAR) PATH '//*/kod_waluty',
PRZELICZNIK VARCHAR2(5 CHAR) PATH '//przelicznik',
KURS_DZIENNY VARCHAR2(10 CHAR) PATH 'kurs_sredni'
) xt;
Wynik: Zauważmy - wszystkie pola sa tekstowe !!!!
- Tworzona jest w pamięci tabela aliasowana przez xt
- Każdy wiersz tabeli xt to powtarzający się element pozycja, opisujący parametry waluty
- W nawiasie po słowie kluczowym XMLTABLE podaje się ścieżkę do analizowanego elementu
- Po słowie kluczowym PASSING podaje się nazwę pola zawierającego XML
- Po słowie kluczowym COLUMNS podaje się definicje i mapowania kolumn. Mapowanie występuje po słowie kluczowym PATH i może być, jak powyżej, wykonane na różne sposoby
- Wyrażenie xt.* zwraca kolumny zdefiniowane w mapowaniu
- W sekcji COLUMNS najlepiej jest robić mapowania na typ znakowy lub na typ numeryczny(ale tylko dla liczb całkowitych). W powyższym przykładzie mapowanie typ NUMBER(4) zadziałałoby dla pola PRZELICZNIK. Dla liczb zmiennopozycyjnych (jak pole w powyższym przypadku KURS_DZIENNY) i dat, automatyczna konwersja jest źródłem problemów. Właściwą konwersję najlepiej przeprowadzić w głównym zapytaniu, a nie na poziomie mapowania
- Jeśli zdefiniujemy typ o niewystarczającej długości, to podczas mapowania teksty zostaną obcięte
- Jedli w danym elemencie nie wystąpi ścieżka z mapowania, wtedy dla odpowiadającej temu mapowaniu kolumny zwracana jest wartość NULL
- W przypadku zmiany kolumny lub dodania nowych pól, modyfikacja istniejącego zapytania jest banalna