2017-03-19 11 views
1

Ich bin mit Oracle DB und ich habe diese Art:SQL - Wählen Sie Instance-Typ

CREATE TYPE t_foo AS OBJECT 
(a VARCHAR2(20)) 
NOT FINAL; 

Und auch diese Subtypen

CREATE TYPE t_foo1 UNDER t_foo() NOT FINAL; 
CREATE TYPE t_foo2 UNDER t_foo() NOT FINAL; 

Ich habe eine Tabelle vom Typ t_foo, wo ich auch Subtypen speichern t_foo von

CREATE TABLE foo OF t_foo; 

Nun meine Frage ist, wie kann ich eine Abfrage wie diese

tun
SELECT a, type FROM foo; 

und den Instanztyp jeder Zeile wie ths erhalten:

__________________ 
| a | type  | 
__________________ 
| bla | t_foo1 | 
| ble | t_foo2 | 
| bli | t_foo1 | 

Antwort

1
SQL> insert into foo values(t_foo1('alpha')); 
1 row inserted. 

SQL> insert into foo values(t_foo2('bravo')); 
1 row inserted. 

SQL> insert into foo values(t_foo('charlie')); 
1 row inserted. 

SQL> commit; 
Commit complete. 

SQL> select 
    f.a, 
    ut.type_name as type_name 
from foo f 
    join user_types ut 
    on ut.typeid = sys_typeid(value(f)); 

A     TYPE_NAME 
-------------------- ---------- 
alpha    T_FOO1  
bravo    T_FOO2  
charlie    T_FOO  
0

Dies ist die Lösung, die ich gefunden.

Es ist nicht allgemein, aber wenn Sie eine begrenzte Anzahl von bekannten Typen haben, ist es eine ziemlich einfache Abfrage.

SELECT f.a, 
    CASE WHEN f IS OF (t_foo1) THEN 't_foo1' 
     WHEN f IS OF (t_foo2) THEN 't_foo2' 
     ELSE 'other' END as type 
FROM foo f