|
DB2中结构化类型和类型化表的管理
使用结构化类型定义的表称为类型化表,同样使用结构化类型定义的视图称为类型化视图,
一个结构化类型可以是另一个结构化类型(超类型)的子类型,子类型可以继承超类型的所有属
性,并且可以增加新的属性,一个子类型也可以是其它结构类型的超类型,因此用户可以运行子
类型和超类型去创建一个结构化类型的类型层次,下面介绍结构化类型和类型化表的管理.
1. 创建结构化类型
CREATETYPE语句可以创建结构化类型
如:
CREATE TYPE TYPE_NEW AS
(EMP_NO VARCHAR(40)
QTY_AGE INTEGER)
REF USING INTEGER
MODE DB2SQL;
2. 创建表并且引用这个新创建的类型
CREATE TABLE EMPLOYEE OFTYPE_NEW
(REF IS OID USERGENERATED);
CREATE TABLE EMP OF EMP_TUNDER EMPLOYEE
INHERIT SELECTPRIVILEGES;
表中的列OID是对象标识符,每个类型化表中必须有OID列作为第一列的,OID列并且是唯一的.
OID列的数据类型是REFERENCE.
REF IS定义OID列的列名.
USERGENERATED子语句表示每当插入新行时,该行的OID列的值由用户决定,一旦插入成功,
该列OID的数值就不在允许更新.
INHERIT SELECTPRIVILEGES表示在超表中拥有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 ADDATTRIBUTE TEL_NO CHAR(12);
ALTER TYPE TYPE_NEW DROPATTRIBUTE TEL_NO;
注意:
如果一个类型或它的子类型是一个已经存在的表的类型,则不能用ALTERTYPE来修改之.
5. 删除类型化表
用语句DROP TABLE HIERARCHYTABLE_NAME可以删除类型化表
用语句DROPVIEW HIERARCHY VIEW_NAME可以删除类型化视图
6. 从类型化表中查询
查询全部记录
SELECT * FROM EMPLOYEE;
只查询表EMPLOYEE上的行,使用ONLY语句
SELECT * FROM ONLY(EMPLOYEE);
不仅查询指定表上的列,还要查询该表的子表上的列,可以使用OUTER语句
SELECT * FROM OUTER(EMPLOYEE);
7. 更新类型化表中的记录
UPDATE EMPLOYEE SETQTY_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 (NAMECHAR(10),;OCATION CHAR(20))
REF USINGINTEGER MODE DB2SQL;
CREATE TYPE EMP_T UNDERTYPE_NEW
AS (SALARYINTEGER,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 OFDEPT_T(REF IS OID USER GENERATED);
CREATE TABLE EMP OF EMP_TUNDER EMPLOYEE
INHERIT SELECTPRIVILEGES
(DEPTREF WITH OPTIONS SCOPEDEPT);
DEPTREF WITH OPTIONS SCOPEDEPT表示DEPTREF列的数值指向DEPT表中的行
SCOPE被称为作用域,类型化表EMP引用领一个类型化表的引用列,这种关系在CREATETABLE时称为作用域.
11.解除引用操作符(DEREFERENCEOPERATOR)
解除引用操作符(->)从有OID列匹配的行返回目标表或它的子表的命名列值.
如:
SELECT E.NAME FROM EMP E
WHEREE.DEPTREF->LOCATION='AUSTN';
上面的语句等价于
SELECT E.NAME FROM EMP E,DEPTD
WHERE E.DEPTREF=D.OID
ANDD.LOCATION='AUSTN';
12.类型化表和类型化视图上的SQL函数
DEREF(函数)
返回变量的结构化类型.
TYPE_ID(表达式)
返回动态数据类型的内部类型标识符,它的变量必须是结构化类型.
如:
SELECTTYPE_ID(DEREF(OID)),NAME FROM EMP;
TYPE_NAME(表达式)
返回动态数据类型的内部类型的绝对名,它的变量必须是结构化类型.
如:
SELECTTYPE_NAME(DEREF(OID)),NAME,SALARY FROM EMP;
TYPE_SCHEMA(表达式)
返回动态数据类型的内部类型的模式名,它的变量必须是结构化类型.
如:
SELECTTYPE_SCHEMA(DEREF(OID)),NAME,SALARY FROM EMP;
13.使用类型化表和视图的注意事项
在子表(主键OID从超表继承)上不能创建主关键词
在子表上不能创建唯一索引
定义在表上的检查约束自动应用到该表的所有子表上
不支持LOAD命令
不支持复制
RUNSTATS,REORG和REORGCHK只在根表上執行 |
|
|