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類型的對象,然後調用父類的方法。

發佈了180 篇原創文章 · 獲贊 335 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章