127.Oracle数据库SQL开发之 数据库对象——类型继承
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50087077
9i引入了对象类型的继承。可以定义层次化的对象类型。
定义一个业务员对象类型,而这个类型从t_person中继承已有的属性。可以对t_person 的属性进行扩展,用来存储人员的业务头衔和供职公司的名字。
对于被继承的t_person而言,定义中必须使用NOT FINAL子句。
如下:
CREATETYPE t_person AS OBJECT (
id INTEGER,
first_nameVARCHAR2(10),
last_name VARCHAR2(10),
dob DATE,
phone VARCHAR2(12),
address t_address,
MEMBERFUNCTION display_details RETURN VARCHAR2
) NOT FINAL;
/
定义主体如下,注意display_details函数返回一个包含业务员id和name的VARCHAR2:
CREATETYPE BODY t_person AS
MEMBERFUNCTION display_details RETURN VARCHAR2 IS
BEGIN
RETURN'id=' || id || ', name=' || first_name || ' ' || last_name;
END;
END;
/
新类继承属性和方法如下,关键词是UNDER子句。
CREATE TYPE t_business_person UNDER t_person (
title VARCHAR2(20),
companyVARCHAR2(20)
);
/
创建对象表如下:
CREATE TABLE object_business_customers OFt_business_person;
插入记录:
INSERTINTO object_business_customers VALUES (
t_business_person(1, 'John', 'Brown', '01-FEB-1955', '800-555-1211',
t_address('2 State Street', 'Beantown', 'MA', '12345'),
'Manager', 'XYZ Corp'
)
);
查询如下:
object_user2@PDB1> select * fromobject_business_customers where id=1;
ID FIRST_NAME LAST_NAME DOB PHONE
---------- ---------- ---------- ---------------------
ADDRESS(STREET,CITY, STATE, ZIP)
----------------------------------------------------------------------------------------------------
TITLE COMPANY
-------------------- --------------------
1 John Brown 01-FEB-55 800-555-1211
T_ADDRESS('2 State Street', 'Beantown','MA', '12345')
Manager XYZ Corp
查询使用display_details函数:
object_user2@PDB1> select o.display_details() fromobject_business_customers o where id=1;
O.DISPLAY_DETAILS()
----------------------------------------------------------------------------------------------------
id=1, name=John Brown
调用方法时,数据库现在子类型中搜索此方法,如果未找到此方法,则搜索超类型。如果有层次化类型,则向上搜索此方法。如果未找到方法,则数据库报告一个错误。