1.2.6 嵌套表AS TABLE OF
嵌套表是表中之表,一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。
语法如下:
CREATE OR REPLACE TYPE table_name AS TABLE OF type;
语法说明:
1. table_name :嵌套表名。
2. type:数组的类型,可以是基本变量,如varchar2,integer等,也可以是自定义的对象类型,如上面定义的NAME_TYPE。
1.2.7 继承-Oracle中面向对象特征
继承父类的子类对象类型将有父类的所有属性、方法和过程。 父类型必须声明为NOT FINAL,子类型使用关键字UNDER。
举例:
--创建父类型
CREATE TYPE animal_type AS OBJECT(
name VARCHAR2(50),
hair VARCHAR2(50),
foot VARCHAR2(50)
) NOT FINAL;
--子类型继承父类型
CREATE TYPE cat_type UNDER animal_type(
paw VARCHAR2(50)
);
如果父类没有声明为NOT FINAL,子类在继承的时候将报错:Error: PLS-00590: attempting to create a subtype UNDER a FINAL type。
1.2.8 重写overriding
重写就是在子类中对父类又有的方法或过程重新实现。重写关键字为overriding,在子类中把要重写的方法或过程声明和实现之前加上该关键字。
举例:
定义头部:
CREATE OR REPLACE TYPE cat_type UNDER annimal_type
(
paw VARCHAR2(50),
OVERRIDING MEMBER PROCEDURE PROC_RUN
)
定义主体:
CREATE OR REPLACE TYPE BODY cat_type
IS
OVERRIDING MEMBER PROCEDURE PROC_RUN
IS
BEGIN
//重新实现
END;
END;
1.2.9 对象表
对象表是指该表的一行都是一个对象(对象类型的实例),每个对象有一个OID(object ID)。
1.2.9.1 对象表的创建
创建对象表的语法:
CREATE TABLE table_name OF object_type;
语法说明:
1.table_name:对象表名称,执行创建对象表语句后,数据库中将会生成一个名字为table_name的表。
2.object_type:对象类型,生成的表的字段和对象类型时对应的。
举例:
CREATE TABLE t_name OF NAME_TYPE;
执行上面语句后,数据库将生成一个t_name表,这个表就是对象表。
1.2.9.2 对象表的关联
对象表之间没有主外键关联的概念,为了体现这层关系,oracle中用了ref对象来实现。
下面介绍下相关操作法和函数:
1. ref操作符:声明引用类型。如 name ref NAME_TYPE, 变量或字段name就是引用类型,存储NAME_TYPE型对象的OID。
2. ref(表的别名)函数:获得对象表中对象OID值,如select ref(a) from otable a。
3. deref(OID)函数:通过OID找到并返回行对象表中对象。
下面通过一个例子说明对象表直接的关联:
--员工对象类型
CREATE OR REPLACE TYPE employee AS OBJECT(
cardId VARCHAR2(100),
address VARCHAR2(100),
sex VARCHAR2(1),
name REF NAME_TYPE, --通过REF操作符,表示该字段引用NAME_TYPE对象,该字段实际存储的时对象的OID
age INTEGER
);
--创建t_employee对象表
CREATE TABLE t_employee OF employee;
--向NAME_TYPE的对象表t_name插入数据
INSERT INTO t_name VALUES('LI', 'KUI');
INSERT INTO t_name VALUES('ZHANG', 'LAN');
INSERT INTO t_name VALUES('CHEN', 'MING');
COMMIT;
--向员工表插入数据
INSERT INTO t_employee VALUES(
'101',
'beijing',
'1',
(SELECT REF(n) FROM t_name n where n.firstname = 'LI'), --通过ref(表别名)获得对象的引用
23
);
INSERT INTO t_employee VALUES(
'102',
'shanghai',
'0',
(SELECT REF(n) FROM t_name n where n.firstname = 'ZHANG'),--通过ref(表别名)获得对象的引用
23
);
COMMIT;
--通过声明一个引用变量,新增数据
DECLARE
-- 声明NAME_TYPE类型的引用
name_ref REF NAME_TYPE;
BEGIN
SELECT REF(n) INTO name_ref FROM t_name n where n.firstname = 'CHEN';
INSERT INTO t_employee VALUES(
'103',
'chengdu',
'1',
name_ref,
24
);
COMMIT;
END;
--查询员工的信息,使用deref来获得对象字段的值
SELECT t.cardId, t.address, deref(t.name) from t_employee t;
--更新引用类型,即赋予新的对象的OID值
UPDATE t_employee t SET name = (SELECT ref(n) FROM t_name n WHERE n.firstname = 'ZHANG') WHERE t.cardId = '103';
DELETE FROM t_employee WHERE name = (SELECT ref(n) FROM t_name n WHERE n.firstname = 'ZHANG');