2017-03-19 13 views
1

を選択して、私は、Oracle DBを使用していますが、私はこのタイプがあります。SQL - インスタンスタイプ

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

をし、またこれらのサブタイプ

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

が、私はまた、サブタイプを格納できるタイプt_fooのテーブルを持っています今t_foo

CREATE TABLE foo OF t_foo; 

の私の質問は、私はこの

ようなクエリを行うことができます方法です
SELECT a, type FROM foo; 

とTHS等各行のインスタンスの型を得る:

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

答えて

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

これは私が見つけた解決策です。

一般的ではありませんが、既知のタイプが限られている場合は、非常に単純なクエリです。

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 
関連する問題