db2中結(jié)構(gòu)化類型和類型化表的管理
作者: ccbzzp
使用結(jié)構(gòu)化類型定義的表稱為類型化表,同樣使用結(jié)構(gòu)化類型定義的視圖稱為類型化視圖,
一個結(jié)構(gòu)化類型可以是另一個結(jié)構(gòu)化類型(超類型)的子類型,子類型可以繼承超類型的所有屬
性,并且可以增加新的屬性,一個子類型也可以是其他結(jié)構(gòu)類型的超類型,因此用戶可以運(yùn)行子
類型和超類型去創(chuàng)建一個結(jié)構(gòu)化類型的類型層次,下面介紹結(jié)構(gòu)化類型和類型化表的管理.
1. 創(chuàng)建結(jié)構(gòu)化類型
create type語句可以創(chuàng)建結(jié)構(gòu)化類型
如:
create type type_new as
(emp_no varchar(40)
qty_age integer)
ref using integer
mode db2sql;
2. 創(chuàng)建表并且引用這個新創(chuàng)建的類型
create table employee of type_new
(ref is oid user generated);
create table emp of emp_t under employee
inherit select privileges;
表中的列oid是對象標(biāo)識符,每個類型化表中必須有oid列作為第一列的,oid列并且是唯一的.
oid列的數(shù)據(jù)類型是reference.
ref is定義oid列的列名.
user generated子語句表示每當(dāng)插入新行時,該行的oid列的值由用戶決定,一旦插入成功,
該列oid的數(shù)值就不在允許更新.
inherit select privileges表示在超表中擁有select權(quán)限的任何用戶或組在新建的子表中
將被授予一個相同的權(quán)限.
3. 新建表employee進(jìn)行插入數(shù)據(jù)
insert into employee
(oid,emp_no,qty_age)
values
(type_new(1),'s1895',33);
上面的例子中結(jié)構(gòu)化類型type_new用兩個屬性emp_no,qty_age來定義的,然后在類型化表
employee中使用該結(jié)構(gòu)化類型typ_new進(jìn)行定義
4. 修改結(jié)構(gòu)化類型
alter type 語句可以增加或刪除一個已經(jīng)存在的結(jié)構(gòu)化類型的屬性
如:
alter type type_new add attribute tel_no char(12);
alter type type_new drop attribute tel_no;
注意:
如果一個類型或它的子類型是一個已經(jīng)存在的表的類型,則不能用alter type來修改之.
5. 刪除類型化表
用語句drop table hierarchy table_name可以刪除類型化表
用語句drop view hierarchy view_name可以刪除類型化視圖
6. 從類型化表中查詢
查詢?nèi)坑涗?br> select * from employee;
只查詢表employee上的行,使用only語句
select * from only(employee);
不僅查詢指定表上的列,還要查詢該表的子表上的列,可以使用outer語句
select * from outer(employee);
7. 更新類型化表中的記錄
update employee set qty_age=40 where oid=type_new(2) ;
強(qiáng)制轉(zhuǎn)換函數(shù)type_new將整數(shù)類型轉(zhuǎn)換為reference類型
8. 刪除類型化表中的記錄
delete from table;
如果用戶只刪除特定類型表(不包括它的子表)中的行,可以使用only語句
delete from only(table);
9. 類型化表屬性的查詢
syscat.tables中的rowtypeschema列和rowtypename列包含類型化表的信息.
syscat.datatypes可以查詢每一個結(jié)構(gòu)化類型.
syscat.hierarchies包括子表和它的直接超表間的關(guān)系以及子類型和它的直接超類型間的關(guān)系.
其中metatype列的包括對象的關(guān)系類型編碼如下:
r---結(jié)構(gòu)化類型之間的關(guān)系
u---類型化表間關(guān)系
w---類型化視圖間關(guān)系
10.引用列
在類型化表定義中,用戶可以將列定義為另一個類型化表的引用列.
被引用的類型化表稱為目標(biāo)表
如:
create type dept_t as (name char(10),;ocation char(20))
ref using integer mode db2sql;
create type emp_t under type_new
as (salary integer,deptref ref(dept_t)) mode db2sql;
emp_t的定義中規(guī)定了兩個屬性,一個是integer的salary,另一個是reference類型的deptref,
ref(dept_t)意味emp_t類型的deptref屬性是引用類型的,并且引用目標(biāo)是行類型dept_t或
dept_t的子類型的表中的行.
下面是創(chuàng)建基于上門的結(jié)構(gòu)化類型的類型化表
create table dept of dept_t(ref is oid user generated);
create table emp of emp_t under employee
inherit select privileges
(deptref with options scope dept);
deptref with options scope dept表示deptref列的數(shù)值指向dept表中的行
scope被稱為作用域,類型化表emp引用領(lǐng)一個類型化表的引用列,這種關(guān)系在create table時稱為作用域.
11.解除引用操作符(dereference operator)
解除引用操作符(->)從有oid列匹配的行返回目標(biāo)表或它的子表的命名列值.
如:
select e.name from emp e
where e.deptref->location='austn';
上面的語句等價于
select e.name from emp e,dept d
where e.deptref=d.oid
and d.location='austn';
12.類型化表和類型化視圖上的sql函數(shù)
deref(函數(shù))
返回變量的結(jié)構(gòu)化類型.
type_id(表達(dá)式)
返回動態(tài)數(shù)據(jù)類型的內(nèi)部類型標(biāo)識符,它的變量必須是結(jié)構(gòu)化類型.
如:
select type_id(deref(oid)),name from emp;
type_name(表達(dá)式)
返回動態(tài)數(shù)據(jù)類型的內(nèi)部類型的絕對名,它的變量必須是結(jié)構(gòu)化類型.
如:
select type_name(deref(oid)),name,salary from emp;
type_schema(表達(dá)式)
返回動態(tài)數(shù)據(jù)類型的內(nèi)部類型的模式名,它的變量必須是結(jié)構(gòu)化類型.
如:
select type_schema(deref(oid)),name,salary from emp;
13.使用類型化表和視圖的注意事項(xiàng)
在子表(主鍵oid從超表繼承)上不能創(chuàng)建主關(guān)鍵字
在子表上不能創(chuàng)建唯一索引
定義在表上的檢查約束自動應(yīng)用到該表的所有子表上
不支持load命令
不支持復(fù)制
runstats,reorg和reorgchk只在根表上執(zhí)行