1、数据及类型准备

创建了一个自定义类型

create or replace type addr_type as object(
        street varchar2(30);
        city	varchar2(30);
        state	varchar2(30);
        country	varchar2(30)
)


这里的 addr_type  是一个用户自定义类型 UDT 

create table r7.cust(
        id	number,
        addr	r7.addr_type
)

 

创建了一个表,其中addr这一列使用了刚才定义的类型。

 

2、数据字典中关于UTD的摸索过程

2.1 通过如下语句获取某个schema下的所有表明及其对应的objid

select o.name,t.obj# from sys.tab$ t,sys.obj$ o,sys.user$ u where t.obj#=o.obj# and o.owner#=u.user# and u.name='r7';
得到如下结果:

2.2、查询出 cust表的objid 为 75198

通过如下语句得到这个表的所有列的内容
select * from sys.col$ where obj#=75178;

2.3、这里可以看到 ADDR列的 type 为121 

通过如下语句得到该列的类型的OID
select * from sys.coltype$ where obj#=75198 and col#=2;

这里得到该类型有4个属性 INTCOLS=4

 

表 sys.coltype$ 中的flags 解释如下

2.4、得到的该类型的TOID,

然后通过如下语句得到该类型的名称
select * from sys.obj$ where oid$='42FA04xxxxx';

2.5、这样就能得到这个列对应的类型名称,

 

然后可以通过owner# 以及 sys.user# 得到这个类型对应的schema

 

组合起来
select o.name, u.name from sys.col$ c,sys.coltype$ ct,sys.obj$ o,sys.user$ u where
c.obj#=ct.obj# and c.obj#=75198 and c.type#=121 and c.col#=ct.col# and ct.toid=o.oid$ and o.owner#=u.user#;

2.6、然后通过如下语句得到该类型的相关属性

select * from sys.type$ where tvoid='42FA04xxxxx';

可以得到他有4个属性,这里 type_code 108 表示object 122 表示collection

 

2.7、结合2.2中的自定义类型的各个列的类型 就可以完整的复原整个语句

 

如下 insert into r7.cust(id,addr) values(1,r7.addr_type('a','b','c','d'));

posted on 2017-03-02 13:38  dspeeding  阅读(658)  评论(0编辑  收藏  举报