2012-10-02 12 views
6

Używam bazy danych Oracle DB do tworzenia profili użytkowników. Przechowałem profile użytkowników w pojedynczej kolumnie XMLTYPE z innymi kolumnami relacyjnymi (identyfikator, nazwa użytkownika, hasło) w tabeli. XML jest w następującym formacie:jak korzystać z xmltable w Oracle?

<profile> 
<subject>I 
     <action>like 
      <object>sports</object> 
       ... 
      <object>music</object 
     </action> 
    </subject> 
</profile> 

użyłem następujące zapytanie,

SELECT * 
FROM user, 
XMLTABLE(
'//profile' 
PASSING user.profile 
return COLUMNS action VARCHAR2(20) PATH '/subject/action', 
     object VARCHAR2(30) PATH '/subject/action/object' 
); 

który daje mi niczego. Jak mogę sprawić, żeby to coś działało?

Odpowiedz

22

action i object na twoim przykładzie nie są na tym samym poziomie, więc zapytanie musi wykonać dodatkowe czynności. Oto przykład:

SQL> create table users (id number, profile xmltype); 

Table created. 

SQL> insert into users values (1, XMLTYPE('<profile> 
    2  <subject>I 
    3   <action>like 
    4    <object>sports</object> 
    5    <object>music</object> 
    6   </action> 
    7  </subject> 
    8 </profile>')); 

1 row created. 

SQL> select u.id, x.action, x.object.getStringVal() 
    2 from users u, 
    3   XMLTABLE('/profile/subject/action' 
    4     passing u.profile 
    5     columns action VARCHAR2(30) PATH 'text()', 
    6       object XMLTYPE PATH 'object') x; 

ID ACTION X.OBJECT.GETSTRINGVAL() 
--- ------- -------------------------------------------------- 
1 like <object>sports</object> <object>music</object> 

Jak widać mamy węzeł, nie jest to, co chcesz, więc dodać XMLTABLE:

SQL> select u.id, x.action, y.object 
    2 from users u, 
    3   XMLTABLE('/profile/subject/action' 
    4     passing u.profile 
    5     columns action VARCHAR2(30) PATH 'text()', 
    6       object XMLTYPE PATH 'object') x, 
    7   XMLTABLE('/object' 
    8     passing x.object 
    9     columns object VARCHAR2(30) PATH '.') y; 

ID ACTION OBJECT 
--- ------- ------- 
1 like sports 
1 like music