Oracle:数据库对象(三)

类型继承

not final子句指示可在定义另一对象类型时被继承。

create type t_person as object (
    id integer,
    first_name varchar(10),
    last_name varchar(10),
    dob date,
    phone varchar(12),
    address t_address,
    not final;
);
1.继承属性
create type t_business_person under t_person (
    title varchar2(20),
    company varchar2(20)
);

用子类型对象代替超类型对象

1.not substitutable对象

阻止子类型对象代替超类型对象

create table object_customers_not_subs of t_person
not substitutable at all levels;

其他有用的对象函数

1.IS OF()函数

检查对象是否为某种特定的类型或子类型。

select value(o) 
from object_business_customer o
where value(o) is of (t_business_person);
2.TREAT()函数

在运行时检查是否可将子类型的对象视为超类型的对象,如果可以,返回一个对象,如果不可以返回null。

select nvl2(treat(value(o) as t_person).first_name, 'yes', 'no')
from object_customers o
where first_name = 'Jason';

NVL2(TREAT(VALUE(O)
---------------------
yes
3.sys_typeid函数

可以得到对象类型的id

select sys_typeid(value(o))
from object_business_customer o;

SYS_TYPEID(VALUE(O))
--------------------
02

not instantiable对象类型

防止创建该类型的对象实例。

create type t_vehicle as object (
    id integer,
    make varchar2(15),
    model varchar2(20)
) not final not instantiable;

用户自定的构造函数

例如:

create type t_person2 as object (
    id integer,
    first_name varchar(10),
    last_name varchar(10),
    dob date,
    phone varchar(12),
constructor function t_person2 (
    p_id integer,
    p_first_name varchar(10),
    p_last_name varchar(10),
)return self as result,
constructor function t_person2 (
    p_id integer,
    p_first_name varchar(10),
    p_last_name varchar(10),
    p_dob date
)return self as result
);

构造函数不包含构造函数的实际代码定义,代码定义在类型体中;
例如:

create type body t_person2 as
constructor function t_person2(
    p_id integer,
    p_first_name varchar2(10),
    p_last_name varchar2(10)
) return self as result is
begin
    self.id := p_id;
    self.first_name := p_first_name;
    self.last_name := p_last_name;
    self.dob = sysdate;
    self.phone := '555-45632';
    return;
end;
constructor function t_person2(
    p_id integer,
    p_first_name varchar2(10),
    p_last_name varchar2(10),
    p_dob date;
) return self as result is
begin
    self.id := p_id;
    self.first_name := p_first_name;
    self.last_name := p_last_name;
    self.dob = p_dob;
    self.phone := '555-45632';
    return;
    end;
end;

重载方法

当创建超类型的子类型时,可以用子类型中的方法重载超类型中的方法。
可以使用overriding关键字进行重载

例如:

create type t_person3 as object (
    id integer,
    first_name varchar(10),
    last_name varchar(10),
    member function display_details return varchar2
)not final;
create type body t_person3 as 
    member function display_details return varchar2 is
begin
    return 'id=' || id || ',name=' ||first_name || ' '||last_name;
    end;
end;

重载

create t_business_person3 under t_person3(
    title varchar2(10),
    company varchar2(10),
    overriding member function display_details return varchar2
);
create type body t_business_person3 as 
    overriding member function display_details return varchar2 is
begin
    return 'id=' || id || ',name=' ||first_name || ' '||last_name||'title='||title;
    end;
end;

通用通用

从子类型中调用超类型的方法
例如:

return (self as t_person).display_details

self as完成的任务是将当前类型的对象视为t_person类型的对象,然后调用父类的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值