DB2中結构化類型和類型化表的管理
作者: CCBZZP
使用結构化類型定義的表稱為類型化表,同樣使用結构化類型定義的視圖稱為類型化視圖,
一個結构化類型可以是另一個結构化類型(超類型)的子類型,子類型可以繼承超類型的所有屬
性,并且可以增加新的屬性,一個子類型也可以是其他結构類型的超類型,因此用戶可以運行子
類型和超類型去創建一個結构化類型的類型層次,下面介紹結构化類型和類型化表的管理.
1. 創建結构化類型
CREATE TYPE語句可以創建結构化類型
如:
CREATE TYPE TYPE_NEW AS
(EMP_NO VARCHAR(40)
QTY_AGE INTEGER)
REF USING INTEGER
MODE DB2SQL;
2. 創建表并且引用這個新創建的類型
CREATE TABLE EMPLOYEE OF TYPE_NEW
(REF IS OID USER GENERATED);
CREATE TABLE EMP OF EMP_T UNDER EMPLOYEE
INHERIT SELECT PRIVILEGES;
表中的列OID是對象標識符,每個類型化表中必須有OID列作為第一列的,OID列并且是唯一的.
OID列的數据類型是REFERENCE.
REF IS定義OID列的列名.
USER GENERATED子語句表示每當插入新行時,該行的OID列的值由用戶決定,一旦插入成功,
該列OID的數值就不在允許更新.
INHERIT SELECT PRIVILEGES表示在超表中擁有SELECT權限的任何用戶或組在新建的子表中
將被授予一個相同的權限.
3. 新建表EMPLOYEE進行插入數据
INSERT INTO EMPLOYEE
(OID,EMP_NO,QTY_AGE)
VALUES
(TYPE_NEW(1),'S1895',33);
上面的例子中結构化類型TYPE_NEW用兩個屬性EMP_NO,QTY_AGE來定義的,然后在類型化表
EMPLOYEE中使用該結构化類型TYP_NEW進行定義
4. 修改結构化類型
ALTER TYPE 語句可以增加或刪除一個已經存在的結构化類型的屬性
如:
ALTER TYPE TYPE_NEW ADD ATTRIBUTE TEL_NO CHAR(12);
ALTER TYPE TYPE_NEW DROP ATTRIBUTE TEL_NO;
注意:
如果一個類型或它的子類型是一個已經存在的表的類型,則不能用ALTER TYPE來修改之.
5. 刪除類型化表
用語句DROP TABLE HIERARCHY TABLE_NAME可以刪除類型化表
用語句DROP VIEW HIERARCHY VIEW_NAME可以刪除類型化視圖
6. 從類型化表中查詢
查詢全部記錄
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) ;
強制轉換函數TYPE_NEW將整數類型轉換為REFERENCE類型
8. 刪除類型化表中的記錄
DELETE FROM TABLE;
如果用戶只刪除特定類型表(不包括它的子表)中的行,可以使用ONLY語句
DELETE FROM ONLY(TABLE);
9. 類型化表屬性的查詢
SYSCAT.TABLES中的ROWTYPESCHEMA列和ROWTYPENAME列包含類型化表的信息.
SYSCAT.DATATYPES可以查詢每一個結构化類型.
SYSCAT.HIERARCHIES包括子表和它的直接超表間的關系以及子類型和它的直接超類型間的關系.
其中METATYPE列的包括對象的關系類型編碼如下:
R---結构化類型之間的關系
U---類型化表間關系
W---類型化視圖間關系
10.引用列
在類型化表定義中,用戶可以將列定義為另一個類型化表的引用列.
被引用的類型化表稱為目標表
如:
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的定義中規定了兩個屬性,一個是INTEGER的SALARY,另一個是REFERENCE類型的DEPTREF,
REF(DEPT_T)意味EMP_T類型的DEPTREF屬性是引用類型的,并且引用目標是行類型DEPT_T或
DEPT_T的子類型的表中的行.
下面是創建基于上門的結构化類型的類型化表
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列的數值指向DEPT表中的行
SCOPE被稱為作用域,類型化表EMP引用領一個類型化表的引用列,這种關系在CREATE TABLE時稱為作用域.
11.解除引用操作符(DEREFERENCE OPERATOR)
解除引用操作符(->)從有OID列匹配的行返回目標表或它的子表的命名列值.
如:
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函數
DEREF(函數)
返回變量的結构化類型.
TYPE_ID(表達式)
返回動態數据類型的內部類型標識符,它的變量必須是結构化類型.
如:
SELECT TYPE_ID(DEREF(OID)),NAME FROM EMP;
TYPE_NAME(表達式)
返回動態數据類型的內部類型的絕對名,它的變量必須是結构化類型.
如:
SELECT TYPE_NAME(DEREF(OID)),NAME,SALARY FROM EMP;
TYPE_SCHEMA(表達式)
返回動態數据類型的內部類型的模式名,它的變量必須是結构化類型.
如:
SELECT TYPE_SCHEMA(DEREF(OID)),NAME,SALARY FROM EMP;
13.使用類型化表和視圖的注意事項
在子表(主鍵OID從超表繼承)上不能創建主關鍵字
在子表上不能創建唯一索引
定義在表上的檢查約束自動應用到該表的所有子表上
不支持LOAD命令
不支持復制
RUNSTATS,REORG和REORGCHK只在根表上執行