面向?qū)ο缶幊毯?jiǎn)稱OOP編程,實(shí)際上是對(duì)現(xiàn)實(shí)世界事物的一種抽象的過(guò)程。它的核心是把對(duì)象的定義和實(shí)現(xiàn)進(jìn)行區(qū)分,讓定義部分對(duì)象所具有的結(jié)構(gòu),讓實(shí)現(xiàn)部分根據(jù)定義部分定義的具體結(jié)構(gòu)進(jìn)行具體的實(shí)現(xiàn)。
創(chuàng)新互聯(lián)是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護(hù)、成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站備案、服務(wù)器租用、主機(jī)域名、軟件開發(fā)、微信小程序等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運(yùn)營(yíng)推廣經(jīng)驗(yàn)的科技公司,有著多年的網(wǎng)站建站經(jīng)驗(yàn),致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個(gè)面向全國(guó)乃至全球的業(yè)務(wù)窗口:建站歡迎咨詢:18982081108
用于生產(chǎn)玩具的模具叫做類,通常設(shè)計(jì)類的過(guò)程也可以稱為建模,當(dāng)然這個(gè)模不是模具的模,而是對(duì)類的模型進(jìn)行建模。所生產(chǎn)的玩具可以叫做對(duì)象,類是對(duì)象的抽象,而對(duì)象是類的具體實(shí)例。類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。類是用于創(chuàng)建對(duì)象的藍(lán)圖,它是一個(gè)定義包括在特定類型的對(duì)象中的方法和變量的軟件模版。
對(duì)類的定義是一組具有相同數(shù)據(jù)結(jié)構(gòu)和相同操作的對(duì)象的集合,類的定義包括一組代表其特性的屬性。以及一組表示其執(zhí)行行為的方法,類定義可以看作是一個(gè)具有相似特性與共同行為的對(duì)象模版,可以用來(lái)產(chǎn)生對(duì)象,而每個(gè)對(duì)象都是類的實(shí)例,都可以使用類中提供的方法,對(duì)象的具體狀態(tài)包含在對(duì)象實(shí)例變量中。
封裝:也叫做信息封裝,確保對(duì)象不會(huì)以不可預(yù)期的方式改變其他對(duì)象的內(nèi)部狀態(tài)。只有在那些提供了內(nèi)部狀態(tài)改變方法的對(duì)象中,才可以訪問(wèn)其他內(nèi)部狀態(tài)。每類對(duì)象都提供一個(gè)與其他對(duì)象聯(lián)系的接口,并規(guī)定了其他對(duì)象進(jìn)行調(diào)用的方法
多態(tài)性:對(duì)象的引用和類會(huì)涉及其他許多不同類型的對(duì)象,而且引用對(duì)象所產(chǎn)生的結(jié)果將依據(jù)實(shí)際調(diào)用的類型
繼承性:允許在現(xiàn)存的對(duì)象基礎(chǔ)上創(chuàng)建子類對(duì)象,統(tǒng)一并增強(qiáng)了多態(tài)性和封裝性。典型地來(lái)說(shuō)就是用類來(lái)對(duì)對(duì)象進(jìn)行分組,而且還可以定義新類為現(xiàn)存的類的擴(kuò)展,這樣就可以將類組織成樹型或網(wǎng)狀結(jié)構(gòu),這體現(xiàn)了對(duì)象的通用性。
對(duì)象類型實(shí)際上就是在上一小節(jié)中介紹的類型,類的實(shí)例就是對(duì)象。對(duì)象的類型封裝了數(shù)據(jù)結(jié)構(gòu)和用于操縱這些數(shù)據(jù)結(jié)構(gòu)的過(guò)程和函數(shù),這使得通過(guò)定義對(duì)象類型就可以封裝一些較復(fù)雜的代碼,提高應(yīng)用開發(fā)的效率和速度??梢栽谝粋€(gè)對(duì)象類型說(shuō)明部分聲明屬性和方法,屬性不能是常數(shù),異常,游標(biāo)或類型,最大的屬性聲明數(shù)量是1000個(gè),但是必須至少聲明一個(gè)屬性,而方法是可選的。屬性描述了對(duì)象的特性,方法則是對(duì)象類型具有的功能。在PLSQL中,方法就是一些子程序,可以是函數(shù),也可以是過(guò)程,方法名稱不能和它的對(duì)象類型名稱和屬性名稱一樣,方法在實(shí)例級(jí)別或?qū)ο箢愋图?jí)別被調(diào)用。
PLSQL中對(duì)象的組成結(jié)構(gòu)
PLSQL中的對(duì)象類型是一種自定義的符合類型,它的定義與包的定義非常相似
對(duì)象類型規(guī)范:是對(duì)象與應(yīng)用的接口,它用于定義對(duì)象的公用屬性和方法
對(duì)象類型體:用于實(shí)現(xiàn)對(duì)象類型規(guī)范所定義的公用方法.
例如在定義員工對(duì)象類型時(shí),先在對(duì)象類型規(guī)范中定義好了對(duì)象的所有屬性,以及對(duì)象可被調(diào)用的方法聲明,這些方法并沒有具體的實(shí)現(xiàn)部分,僅可供外部調(diào)用的方法簽名。而具體的方法體代碼實(shí)現(xiàn)則定義在對(duì)象類型體中。
在定義對(duì)象類型的屬性時(shí),不能指定對(duì)象屬性的默認(rèn)值,也不能指定NOT NULL選項(xiàng)。
PLSQL中可以定義的幾種類型的方法
1.構(gòu)造方法:該方法類似于JAVA等語(yǔ)言中的構(gòu)造函數(shù),用來(lái)初始化一個(gè)對(duì)象類型并返回對(duì)象的實(shí)例
2.MEMBER方法:該方法允許對(duì)象的實(shí)例進(jìn)行調(diào)用,在MEMBER方法中可以訪問(wèn)對(duì)象實(shí)例的數(shù)據(jù),通常稱為實(shí)例方法或成員方法
3.STATIC方法:該方法可以直接在對(duì)象類型上進(jìn)行調(diào)用,它用于在對(duì)象類型上執(zhí)行全局操作,通常稱為靜態(tài)方法
4.MAP方法:用于在多個(gè)對(duì)象間排序的映射方法。
5.ORDER方法:用于在兩個(gè)對(duì)象實(shí)例間排序的排序方法。
定義對(duì)象類型
對(duì)象類型包含對(duì)象類型規(guī)范和對(duì)象類型體兩大部分,因此在定義時(shí)必須先定義對(duì)象類型規(guī)范,然后再定義對(duì)象類型體.
定義employee_obj對(duì)象規(guī)范
create or replace type employee_obj as object(
empno number(4),
ename varchar2(20),
job varchar2(20),
sal number(10,2),
comm number(10,2),
deptno number(4),
MEMBER procedure change_sal(p_empno number,p_sal number),
MEMBER procedure change_comm(p_empno number,p_comm number),
MEMBER procedure change_deptno(p_empno number,p_deptno number),
MEMBER procedure get_sal(p_empno number) return number,
MEMBER procedure get_comm(p_empno number) return number,
MEMBER procedure get_deptno(p_empno number) return integer
)NOT FINAL; --指定該類可以被繼承,如果指定FINAL,表示該類無(wú)法被繼承
定義對(duì)象體
create or replace type body employee_obj
as
member procedure chang_sal(p_empno number,p_sal number)
is
begin
update emp set sal=p_sal where empno=p_empno;
end;
member procedure chang_comm(p_empno number,p_sal number)
is
begin
update emp set comm=p_comm where empno=p_empno;
end;
member procedure chang_deptno(p_empno number,p_sal number)
is
begin
update emp set deptno=p_deptno where empno=p_empno;
end;
member function get_sal (p_empno number)
return number
is
v_sal number(10,2);
begin
select sal into v_sal from emp where empno=p_empno;
return v_sal;
end;
member function get_comm(p_empno number)
return number
is
v_comm number(10,2);
begin
select comm into v_comm from emp where empno=p_empno;
RETURN v_comm;
end;
member function get_deptno(p_empno number)
return integer
is
v_deptno int;
begin
select deptno into v_deptno from emp where empno=p_empno;
return v_deptno;
end;
end;
定義屬性
屬性是對(duì)象類型特性的定義,屬性聲明是一個(gè)對(duì)象必需的,也就是說(shuō)一個(gè)對(duì)象類型至少要定義一個(gè)屬性。屬性的定義與變量的定義相似,也具有名稱和數(shù)據(jù)類型,在整個(gè)對(duì)象類型中,屬性的名稱必須是唯一的,但是在不同的對(duì)象類型之間,屬性的命名是可以重復(fù)的。
1.屬性的聲明必須在方法的聲明以前,也就是說(shuō)在對(duì)象規(guī)范中create type下面的聲明必須最先是屬性的定義。
2.屬性的數(shù)據(jù)類型必須是oracle數(shù)據(jù)庫(kù)類型,不能是任何PLSQL類型或PLSQL自定義類型,但是排除了oracle中的rowid,urowid,long,log raw,nchar,nclob,nvarchar2類型。
3.在定義屬性時(shí)不能對(duì)屬性應(yīng)用NOT NULL約束或使用default指定默認(rèn)值。
4.在一個(gè)對(duì)象類型中至少要定義一個(gè)屬性,但是不能大于1000個(gè)屬性.
屬性的類型既可以是簡(jiǎn)單的數(shù)據(jù)類型,也可以是對(duì)象類型的引用.
定義對(duì)象的屬性
create or replace type employee as object(
empno number(4),
ename varchar2(20),
job varchar2(20),
sal number(10,2),
comm number(10,2),
deptno number(4)
)NOT FINAL;
在定義了該對(duì)象類型之后,就可以在PLSQL語(yǔ)句塊中通過(guò)實(shí)例化對(duì)象類型,讀取或?qū)懭雽?duì)象的屬性值了.
declare
v_emp employee_property;
v_sal v_emp.sal%TYPE;
begin
v_emp:=employee_property(7890,'趙五','銷售人員',5000,200,20);
v_sal:=v_emp.sal;
dbms_output.put_line(v_emp.ename||'的薪資是:'||v_sal);
end;
定義方法
對(duì)象方法是在對(duì)象規(guī)范定義中使用MEMBER或STATIC聲明在對(duì)象說(shuō)明部分的子程序,它們是在屬性聲明之后進(jìn)行的,
MEMBER方法:成員方法是基于對(duì)象實(shí)例而不是基于對(duì)象類型調(diào)用的
STATIC方法:靜態(tài)方法獨(dú)立于對(duì)象實(shí)例,也不能在對(duì)象類型主體中引用這個(gè)對(duì)象的屬性
使用MEMBER和STATIC成員方法
create or replace type employee_method as object(
empno number(4),
sal number(10,2),
comm number(10,2),
deptno number(4),
MEMBER procedure change_sal, --實(shí)例方法,可以訪問(wèn)對(duì)象本身的屬性
MEMBER function get_sal return number,
--靜態(tài)方法,不能訪問(wèn)對(duì)象本身的屬性,只能訪問(wèn)靜態(tài)數(shù)據(jù)
STATIC procedure change_deptno(p_empno number,p_deptno number),
STATIC function get_sal(p_empno number) return number
)NOT FINAL; --指定該類可以被繼承,如果指定FINAL,表示該類無(wú)法被繼承
create or replace type body employee_method
as
MEMBER procedure change_sal
is
begin
self.sal:=self.sal*1.12;
end;
MEMBER function get_sal
return number
is
begin
return sal;
end;
STATIC procedure change_deptno(p_empno number,p_deptno number)
is
begin
update emp set deptno=p_deptno where empno=p_empno;
end;
STATIC function get_sal(p_empno number)
return number
is
v_sal number(10,2);
begin
select sal into v_sal from emp where empno=p_empno;
return v_sal;
end;
end;
MEMBER和STATIC方法使用示例
declare
v_emp employee_method;
begin
v_emp:=employee_method(7999,5000,200,20); --實(shí)例化employee_method對(duì)象,現(xiàn)在v_emp是對(duì)象實(shí)例
v_emp.change_sal; --調(diào)用對(duì)象實(shí)例方法,即MEMBER方法
dbms_output.put_line('員工編號(hào)為:'||v_emp.empno||'的薪資為:'||v_emp.get_sal);
--下面的代碼調(diào)用STATIC方法更新emp表中員工編號(hào)為7369的部門編號(hào)為20
employee_method.change_deptno(7369,20);
--下面的代碼獲取emp表中員工編號(hào)為7369的員工薪資
dbms_output.put_line('員工編號(hào)為7369的薪資為:'||employee_method.get_sal(7369));
end;
使用SELF關(guān)鍵字
每一個(gè)MEMBER類型方法都隱式地聲明了一個(gè)內(nèi)聯(lián)參數(shù)SELF,它代表了對(duì)象類型的一個(gè)實(shí)例,總是被傳遞給成員方法的第一個(gè)參數(shù),實(shí)際上的方法體內(nèi),也可以不用SELF。
訪問(wèn)對(duì)象類型的屬性
create or replace type employee_salobj as object(
empno number(4),
sal number(10,2),
comm number(10,2),
deptno number(4),
MEMBER procedure change_sal,
MEMBER procedure change_comm,
MEMBER procedure change_deptno,
MEMBER function get_sal return number,
MEMBER function get_comm return number,
MEMBER function get_deptno return INTEGER
)NOT FINAL;
create or replace type body employee_salobj
as
MEMBER procedure change_sal
is
begin
self.sal:=self.sal*1.12;
end;
MEMBER procedure change_comm
is
begin
comm:=comm * 1.12;
end;
MEMBER procedure change_deptno
is
begin
self.deptno:=20;
end;
MEMBER function get_sal
return number
is
begin
return sal;
end;
MEMBER function get_comm
return self.comm;
end;
MEMBER function get_deptno
return integer
is
begin
return self.deptno
end;
end;
在employee_salobj對(duì)象類型體的成員實(shí)現(xiàn)中,顯式地使用self進(jìn)行對(duì)象屬性的訪問(wèn),當(dāng)沒有顯式使用self關(guān)鍵字時(shí),實(shí)際上也是隱式地使用了這個(gè)關(guān)鍵字。
由于STATIC屬于靜態(tài)方法級(jí)別,因此它不能接受或引用self關(guān)鍵字
定義構(gòu)造函數(shù)
當(dāng)定義了一個(gè)對(duì)象類型之后,系統(tǒng)會(huì)提供一個(gè)接收與每個(gè)屬性相對(duì)應(yīng)的參數(shù)的構(gòu)造函數(shù)。
一般出于如下目的來(lái)自定義構(gòu)造函數(shù):
1.為對(duì)象提供初始化功能,以避免許多具有特別用途的過(guò)程只初始化對(duì)象的不同部分,可以通過(guò)構(gòu)造函數(shù)進(jìn)行統(tǒng)一初始化
2.可以在構(gòu)造函數(shù)中為某些屬性提供默認(rèn)值,這樣就能確保屬性值的正確性,而不必依賴于調(diào)用者所提供的每一個(gè)屬性值。
3.出于維護(hù)性的思考,在新的屬性添加到對(duì)象中時(shí),避免要更改調(diào)用構(gòu)造函數(shù)的應(yīng)用程序中的代碼,這樣可以使已經(jīng)存在的構(gòu)造函數(shù)調(diào)用繼續(xù)工作.
構(gòu)造函數(shù)的定義是一個(gè)與對(duì)象類型名稱具有相同名稱的函數(shù),用于初始化對(duì)象,并能返回一個(gè)對(duì)象類型的新實(shí)例。在自定義構(gòu)造函數(shù)時(shí),要么就覆蓋由oracle為每一個(gè)對(duì)象生成的默認(rèn)構(gòu)造函數(shù),要么就定義一個(gè)有著不同方法簽名的新構(gòu)造函數(shù)。自定義構(gòu)造函數(shù)使用constructor關(guān)鍵字進(jìn)行聲明.
自定義構(gòu)造函數(shù)示例
create or replace type salary_obj as object(
percent number(10,4), --定義對(duì)象類型
sal number(10,2),
--自定義構(gòu)造函數(shù)
constructor function salary_obj(p_sal number) return self as result)
instantiable
final;
/
--定義對(duì)象類型體
create or replace type body salary_obj
as
--實(shí)現(xiàn)重載的構(gòu)造函數(shù)
constructor function salary_obj(p_sal number)
return self as result
as
begin
self.sal:=p_sal;
self.percent:=1.12;
return;
end;
end;
/
調(diào)用
declare
v_salobj1 salary_obj;
v_salobj2 salary_obj;
begin
v_salobj1:=salary_obj(1.12,3000); --使用默認(rèn)構(gòu)造函數(shù)
v_salobj2:=salary_obj(2000);--使用自定義構(gòu)造函數(shù)
end;
定義MAP和ORDER方法
MAP方法:該函數(shù)會(huì)將對(duì)象實(shí)例根據(jù)一定的調(diào)用規(guī)則返回FATE,NUMBER,varchar2類型的標(biāo)量類型,在映射對(duì)象類型為標(biāo)量函數(shù)后,就可以通過(guò)對(duì)標(biāo)量函數(shù)的比較來(lái)得到結(jié)果了。
ORDER方法:order方法只能對(duì)兩個(gè)對(duì)象之間進(jìn)行比較,必須是返回?cái)?shù)值型結(jié)果的函數(shù),根據(jù)結(jié)果返回正數(shù),負(fù)數(shù)或零。該方法只有兩個(gè)參數(shù),SELF和另外一個(gè)要比較的對(duì)象類型,如果傳遞該參數(shù)為NULL,則返回NULL。
由于MAP方法一次調(diào)用時(shí)就將所有的對(duì)象映射為一個(gè)標(biāo)量值,因此通常用在排序或合并很多對(duì)象時(shí)。而order方法一次僅能比較兩個(gè)對(duì)象,因此在比較多個(gè)對(duì)象時(shí)需要被重復(fù)調(diào)用,效率會(huì)低一些。
定義MAP函數(shù)示例
create or replace type employee_map as object(
empnonumber(4),
salnumber(10,2),
commnumber(10,2),
deptnonumber(4),
MAP MEMBER FUNCTION convert return real --定義一個(gè)MAP方法
)NOT FINAL;
create or replace type body employee_emp as
MAP MEMBER FUNCTION convert return real is --定義一個(gè)MAP方法
begin
return sal+comm;
end;
end;
在定義了MAP函數(shù)后,PLSQL會(huì)隱式地通過(guò)調(diào)用MAP函數(shù)在多個(gè)對(duì)象間進(jìn)行排序或比較。例如下面創(chuàng)建了一個(gè)emp_map_tab的對(duì)象表,向這個(gè)對(duì)象表插入多個(gè)對(duì)象,然后就可以對(duì)這個(gè)對(duì)象表進(jìn)行對(duì)象的排序
create table emp_map_tab of employee_map;
insert into emp_map_tab values(7123,3000,200,20);
col val format a60;
select value(r) val,r.sal+r.comm from emp_emp_tab r order by 1;
定義order函數(shù)示例
create or replace type employee_order as object(
empnonumber(4),
salnumber(10,2),
commnumber(10,2),
deptnonumber(4),
ORDER MEMBER FUNCTION match(r employee_order) return integer --定義一個(gè)ORDER方法
)NOT FINAL;
create or replace type body employee_order as
ORDER MEMBER FUNCTION match(r employee_order) return integer is
begin
if ((SELF.sal+SELF.comm)<(r.sal+r.comm)) then
return -1;
elsif((SELF.sal+SELF.comm)>(r.sal+r.comm)) then
return 1;
else
return 0;
end if;
end match;
end;
定義了order函數(shù)后,就可以對(duì)兩個(gè)對(duì)象進(jìn)行比較。
declare
emp1 employee_order:=employee_order(7112,3000,200,20);
emp2 employee_order:=employee_order(7113,3800,100,20);
begin
if emp1>emp2 then
dbms_output.put_line('員工1的薪資加提成比員工2大');
elsif emp1<emp2 then
dbms_output.put_line('員工1的薪資加提成比員工2小');
else
dbms_output.put_line('員工1的薪資加提成與員工2相等');
end if;
end;
使用對(duì)象類型
對(duì)象類型一旦被創(chuàng)建成功,就被保存到了oracle數(shù)據(jù)字典中,用戶可以再任何的PLSQL塊,子程序或包中使用它來(lái)聲明對(duì)象
1.聲明對(duì)象
聲明的對(duì)象必須是已經(jīng)在oracle數(shù)據(jù)字典中存在的對(duì)象類型。在聲明時(shí)可以直接使用對(duì)象的構(gòu)造函數(shù)進(jìn)行初始化,如果沒有初始化,那么對(duì)象實(shí)例初始化為NULL。
declare
o_empemployee_order;
begin
o_emp:=employee_order(7123,3000,200,20);
dbms_output.put_line('員工編號(hào)為:'
||o_emp.empno
||'的薪資和提成為:'
||(o_emp.sal+o_emp.comm)
);
end;
在語(yǔ)句塊的定義區(qū)定義了對(duì)象類型的變量,o_emp在定義區(qū)的初始化狀態(tài)下為NULL,在語(yǔ)句塊的執(zhí)行部分,使用對(duì)象類型的構(gòu)造函數(shù)實(shí)例化了對(duì)象類型,然后通過(guò)訪問(wèn)對(duì)象類型的屬性來(lái)獲取對(duì)象實(shí)例的信息.
也可以將對(duì)象類型作為存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)的形式參數(shù),將對(duì)象實(shí)例從一個(gè)子程序傳遞到另一個(gè)子程序。
在子程序中使用對(duì)象類型
create or replace procedure changesalary(p_emp in employee_order)
as
begin
if p_emp is not null then --如果對(duì)象類型已經(jīng)實(shí)例化,更新emp表
update emp set sal=p_emp.sal,comm=p_emp.comm where empno=p_emp.empno;
end if;
end changesalary;
--使用對(duì)象類型作為函數(shù)的傳出參數(shù)
create or replace function getsalary(p_emp in out employee_order) return number
as
begin
if p_emp is not null then --如果沒有實(shí)例化,那就實(shí)例化對(duì)象類型
p_emp:=employee_order(7125,5000,800,20);
end if;
return p_emp.sal+p_emp.comm;
end;
2.初始化對(duì)象
declare
o_emp employee_order:=employee_order(NULL,NULL,NULL,NULL);
begin
o_emp.empno:=7301;
o_emp.sal:=5000;
o_emp.comm:=300;
o_emp.deptno:=20;
end;
3.調(diào)用對(duì)象方法
在對(duì)象類型中,方法分為靜態(tài)方法和實(shí)例方法,靜態(tài)方法在定義時(shí)使用STATIC前綴,實(shí)例方法在定義時(shí)使用MEMBER關(guān)鍵字進(jìn)行定義。這兩類方法的調(diào)用方式也不同,實(shí)例方法在實(shí)例級(jí)別進(jìn)行調(diào)用,而靜態(tài)方法在對(duì)象類型的級(jí)別,也就是類級(jí)別進(jìn)行調(diào)用。在一些高級(jí)程序設(shè)計(jì)語(yǔ)言比如JAVA,靜態(tài)方法又稱為類方法。
調(diào)用靜態(tài)方法與實(shí)例方法實(shí)例
create or replace type employee_method as object(
empnonumber(4),
salnumber(10,2),
commnumber(10,2),
deptnonumber(4),
MEMBER PROCEDURE change_sal,
MEMBER FUNCTION get_sal return number,
STATIC PROCEDURE change_deptno(empno number,deptno number),
STATIC FUNCTION get_sal(empno number) return number
)not final;
調(diào)用
declare
o_empemployee_method:=employee_method(7369,5000,800,20);
v_salnumber(10,2);
begin
v_sal:=o_emp.get_sal; --調(diào)用對(duì)象實(shí)例級(jí)別的方法
dbms_output.put_line('對(duì)象實(shí)例級(jí)別的工資為:'||v_sal);
v_sal:=employee_method.get_sal(o_emp.empno); --調(diào)用對(duì)象級(jí)別的方法
dbms_output.put_line('對(duì)象類型級(jí)別的工資為:'||v_sal);
end;
使用嵌套對(duì)象類型
嵌套對(duì)象類型是指一個(gè)對(duì)象中嵌入另一個(gè)對(duì)象類型。在為對(duì)象類型定義屬性時(shí),除了可以使用標(biāo)量類型之外,還可以通過(guò)自定義的對(duì)象類型來(lái)提升整個(gè)對(duì)象類型的靈活性。
定義地址對(duì)象類型
create or replace type address_type
as object
(street_addr1 varchar2(25),
street_addr2varchar2(25),
cityvarchar2(30),
statevarchar2(2),
zip_codenumber,
--成員方法,返回地址字符串
MEMBER FUNCTION tostring return varchar2,
--MAP方法提供地址比較函數(shù)
MAP MEMBER FUNCTION mapping_function return varchar2
)
--定義地址對(duì)象類型體,實(shí)現(xiàn)成員方法與MAP函數(shù)
create or replace type body address_type
as
MEMBER FUNCTION tostring
return varchar2
is
begin
if (street_addr2 is not null)
then
return street_addr1
||CHR(10)
||street_addr2
||CHR(10)
||city
||','
||state
||' '
||zip_code;
else
return street_addr1 ||CHR(10)||city||','||state||' '||zip_code;
end if;
end;
MAP MEMBER FUNCTION mapping_function
return varchar2
is
begin
return to_char(NVL(zip_code,0),'fm00000')
||LPAD (NVL(city,''),30)
||LPAD (NVL(street_addr1,''),25)
||LPAD (NVL(street_addr2,''),25);
end;
end;
定義包含其他對(duì)象類型的類型
create or replace type employee_addr as object(
empnonumber(4),
salnumber(10,2),
commnumber(10,2),
deptnonumber(4),
addraddress_type,
MEMBER FUNCTION get_emp_info return varchar2
)NOT FINAL;
--定義對(duì)象類型體,實(shí)現(xiàn)get_emp_info方法
create or replace type body employee_addr
as
MEMBER FUNCTION get_emp_info
return varchar2
is
begin
return '員工'||SELF.empno||'的地址為:'||SELF.addr.tostring;
end;
end;
為了使用employee_addr對(duì)象類型,在構(gòu)造對(duì)象的實(shí)例時(shí),必須要同時(shí)構(gòu)造address_type的嵌套對(duì)象類型。
declare
o_address address_type;
o_emp employee_addr;
begin
--實(shí)例化地址對(duì)象類型
o_address:=address_type('玉蘭一街','二巷','深圳','DG',523343);
--實(shí)例化員工對(duì)象類型
o_emp:=employee_addr(7369,5000,800,20,o_address);
--輸出員工信息
dbms_output.put_line('員工信息為'||o_emp.get_emp_info);
end;
對(duì)象繼承
繼承是指在已存在的對(duì)象類型的基礎(chǔ)上建立新對(duì)象類型的一種技術(shù),新定義的類可包含現(xiàn)有類所聲明的數(shù)據(jù),定義及包含新定義的對(duì)象類型所增加的聲明的組合。
對(duì)象類型繼承由父類型和子類型組成,其中父類型用于定義可供子類型使用的公共的屬性和方法,而子類型不但可以使用這些公共的屬性和方法,還可以具有自己私有的屬性和方法。
例如,在對(duì)現(xiàn)實(shí)世界的實(shí)體進(jìn)行抽象時(shí),可以發(fā)現(xiàn)企業(yè)中的員工都有一些共性,因此將其抽象出一個(gè)父類型,用來(lái)定義一個(gè)基類,比如員工都包含了姓名,性別,出生日期等,可以基于這些特性定義一個(gè)person_obj的對(duì)象類型,然后在該類型的基礎(chǔ)上繼承一個(gè)子類employee_personobj類型,除了具有person_obj的特性外,還具有員工證件號(hào)碼,工資,提成和職位信息,類繼承結(jié)構(gòu)。
實(shí)現(xiàn)person_obj父對(duì)象
create or replace type person_obj as object(
person_namevarchar(20),
gendervarchar2(2),
birthdateDATE,
addressvarchar2(50),
MEMBER FUNCTION get_info return varchar2
)NOT FINAL;
create or replace type body person_obj
as
MEMBER FUNCTION get_info return varchar2
is
begin
return '姓名:' || person_name||',家庭住址:'||address;
end;
end;
子對(duì)象employee_personpbj的實(shí)現(xiàn)
create or replace type employee_personobj under person_obj(
empnonumber(6),
salnumber(10,2),
jobvarchar2(10),
MEMBER FUNCTION get_emp_info return varchar2
);
create or replace type body employee_personobj as
MEMBER FUNCTION get_emp_info return varchar2 is
begin
return '員工編號(hào):' || SELF.empno ||'員工名稱:' || SELF.person_name||'職位:'||SELF.job;
end;
end;
為了從一個(gè)父對(duì)象中繼承,在子對(duì)象中使用UNDER關(guān)鍵字,指定一個(gè)父對(duì)象名稱,該父對(duì)象必須使用NOT FINAL關(guān)鍵字定義的對(duì)象。在子對(duì)象中新增了屬性和方法后,就被合并到父對(duì)象中去了,因此可以看到在對(duì)象體實(shí)現(xiàn)時(shí),可以直接使用SELF關(guān)鍵字訪問(wèn)父對(duì)象中的person_name屬性。
使用方法:
declare
o_emp employee_personobj;
begin
--使用構(gòu)造函數(shù)實(shí)例化員工對(duì)象
o_emp:=employee_personobj('張小五','F',TO_DATE('1983-01-01','YYYY-MM-DD'),'中信',7981,5000,'Programmer');
dbms_output.put_line(o_emp.get_info);
dbms_output.put_line(o_emp.get_emp_info);
end;
方法重載
所謂重載就是定義一個(gè)或多個(gè)具有同名的函數(shù)或過(guò)程,但是參數(shù)類型名個(gè)數(shù)不同,由編譯器根據(jù)調(diào)用參數(shù)確定執(zhí)行哪一個(gè)子程序。這種重載方式有時(shí)候也稱為靜態(tài)多態(tài)。在使用對(duì)象繼承時(shí),也可以使用方法重載。但是這種方法重載不同于過(guò)程或包中的重載,這種重載使用了動(dòng)態(tài)方法調(diào)用的能力,也稱為動(dòng)態(tài)多態(tài)或運(yùn)行時(shí)多態(tài)。也就是說(shuō)具體的調(diào)用方法不是在編譯時(shí)確定的,而是在代碼實(shí)際執(zhí)行時(shí)才確定的重載。
對(duì)象方法的重載使用OVERRIDING關(guān)鍵字,不是根據(jù)參數(shù)的個(gè)數(shù)來(lái)決定調(diào)用哪一個(gè)方法,而是根據(jù)優(yōu)先級(jí)進(jìn)行調(diào)用,也就是總是先調(diào)用子類的方法。
實(shí)現(xiàn)對(duì)象方法重載
create or replace type employee_personobj under person_obj(
empnonumber(6),
salnumber(10,2),
jobvarchar2(10),
MEMBER FUNCTION get_emp_info return varchar2,
--定義重載方法
OVERRIDING MEMBER FUNCTION get_info return varchar2
);
create or replace type body employee_personobj as
MEMBER FUNCTION get_emp_info return varchar2 is
begin
return '員工編號(hào):' || SELF.empno||'員工名稱:'||SELF.person_name||'職位:'||SELF.job;
end;
--實(shí)現(xiàn)重載方法
OVERRIDING MEMBER FUNCTION get_info return varchar2 as
begin
return '員工編號(hào):' ||SELF.empno||'員工名稱:'||SELF.person_name||'職位':||SELF.job;
end;
end;
調(diào)用employee_personobj對(duì)象實(shí)例的get_info方法時(shí),將看到的是來(lái)自重載方法中的消息
declare
o_emp employee_personobj;
begin
--使用構(gòu)造函數(shù)實(shí)例化員工對(duì)象
o_emp:=employee_personobj('張小五','F',TO_DATE('1983-01-01','YYYY-MM-DD'),'中信',7981,5000,'Programmer');
dbms_output.put_line(o_emp.get_info);
end;
管理對(duì)象表
對(duì)象表就像普通的表一樣,只是存儲(chǔ)的事對(duì)象類型,該表中的每一個(gè)字段與對(duì)象的一個(gè)屬性相對(duì)應(yīng),然后使用對(duì)象表的每一行或者稱為每一條記錄存儲(chǔ)一個(gè)對(duì)象類型的實(shí)例。
create table emp_obj_table of employee_personobj;
創(chuàng)建對(duì)象表使用的是create table of 語(yǔ)句。
可以使用desc 查看到結(jié)構(gòu),和對(duì)象中包含的屬性類型。
創(chuàng)建的對(duì)象表一旦引用了特定的對(duì)象類型,就不能使用drop type語(yǔ)句對(duì)對(duì)象類型進(jìn)行刪除,如果非要這樣做,oracle會(huì)報(bào)錯(cuò)。
如果對(duì)象類型中包含嵌套的對(duì)象類型,那么嵌套的對(duì)象表類型會(huì)被作為一列存儲(chǔ)到對(duì)象表中,比如employee_addr的addr屬性是一個(gè)嵌套了address_type對(duì)象類型的屬性,因此當(dāng)創(chuàng)建一個(gè)employee_addr對(duì)象類型的數(shù)據(jù)表,會(huì)將addr作為一個(gè)單獨(dú)的列。
create table emp_addr_table of employee_addr;
使用set desc depth all linenum on 語(yǔ)句。
插入對(duì)象表
插入數(shù)據(jù)的語(yǔ)法與向普通表插入數(shù)據(jù)一樣,使用insert命令。
除了直接插入列值外,在向?qū)ο箢愋偷谋碇胁迦霐?shù)據(jù)時(shí),可以先實(shí)例化一個(gè)對(duì)象類型,然后向insert語(yǔ)句的values子句傳入構(gòu)建的對(duì)象類型。
declare
o_emp employee_personobj;
begin
--使用構(gòu)造函數(shù)實(shí)例化員工對(duì)象
o_emp:=employee_personobj('張小五','F',TO_DATE('1983-01-01','YYYY-MM-DD'),'中信',7981,5000,'Programmer');
insert into emp_obj_table values(o_emp);
end;
檢索對(duì)象表
對(duì)象表的查詢與關(guān)系表的查詢一樣。
1.value函數(shù)
在查詢語(yǔ)句中使用value函數(shù)將返回存儲(chǔ)在對(duì)象表中的對(duì)象實(shí)例,因此對(duì)于查詢的單行記錄,可以使用select into 語(yǔ)句將查詢出來(lái)的值插入到預(yù)定義的對(duì)象實(shí)例中;對(duì)于查詢返回的多行記錄,可以使用游標(biāo)來(lái)獲取查詢出來(lái)的對(duì)象實(shí)例。
select value(e) from emp_obj_table e;
該查詢返回了存儲(chǔ)在emp_obj_table表中所有的對(duì)象實(shí)例,每一行一個(gè)對(duì)象實(shí)例。
下面演示使用select into 將查詢的結(jié)果賦值給一個(gè)對(duì)象類型的變量:
declare
o_emp employee_personobj;
begin
--使用select into 語(yǔ)句將value函數(shù)返回的對(duì)象實(shí)例插入到對(duì)象類型的變量
select value(e) into o_emp from emp_obj_table e where e.person_name='張小五';
--輸出對(duì)象類型的屬性值
dbms_output.put_line(o_emp.person_name||'的職位是:'||o_emp.job);
end;
使用游標(biāo)和value函數(shù)查詢多行數(shù)據(jù)結(jié)果
declare
o_emp employee_personobj;
cursor all_emp
is
select value(e) as emp from emp_obj_table e;
begin
for each_emp in all_emp
loop
o_emp:=each_emp.emp;
--輸出對(duì)象實(shí)例信息
dbms_output.put_line(o_emp.person_name||'的職位是:'||o_emp.job);
end loop;
end;
2.REF函數(shù)
與value相對(duì)應(yīng)的ref函數(shù)也可以用來(lái)檢索對(duì)象表中的數(shù)據(jù),但是由其名可知,它返回的事一個(gè)對(duì)象的引用。二者之間的主要區(qū)別在于引用類型返回的只是指向?qū)ο髮?shí)際位置的一個(gè)指針,而value類型會(huì)把對(duì)象副本從一個(gè)子程序傳遞到另一個(gè)子程序,程序執(zhí)行時(shí)的效率可能會(huì)降低。
使用共享對(duì)象類型,可以避免數(shù)據(jù)不必要的重復(fù),而且在共享的內(nèi)容更新時(shí),任何引用所指向的內(nèi)容也會(huì)被立即更新。
create type address as object( --創(chuàng)建地址類型
street varchar2(35),
cityvarchar2(15),
statechar(2),
zip_codeinteger
);
create table addresses of address; --創(chuàng)建地址對(duì)象表
create type person as object( --創(chuàng)建人員對(duì)象類型
person_namevarchar2(15),
birthdayDATE,
home_addressREF address, --使用ref關(guān)鍵字,指定屬性為指向另一個(gè)對(duì)象表的對(duì)象
phone_numbervarchar2(15)
);
create table persons of person; --創(chuàng)建人員對(duì)象表
插入數(shù)據(jù)
insert into addresses values(address ('玉蘭','深圳','GD','321413'));
insert into persons values(person ('王小五',TO_DATE('1983-01-01','YYYY-MM-DD'),(select ref(a) from addresses a where street='玉蘭'),'1312332'));
使用PL/SQL語(yǔ)句塊向?qū)ο蟊碇胁迦胍妙愋偷膶?duì)象
declare
addref ref address; --定義一個(gè)引用類型的對(duì)象
begin
select ref (a) into addref from addresses a where street='玉蘭';
insert into persons values(person('武大郎',TO_DATE('1983-01-01','YYYY-MM-DD'),addref,'1312312'));
end;
在語(yǔ)句塊中使用ref關(guān)鍵字定義了一個(gè)指向address對(duì)象類型的引用類型,然后使用ref函數(shù)從address表中返回匹配的引用類型的指針,最后將這個(gè)引用類型作為home_address屬性的值插入到persons表中.
當(dāng)對(duì)象表中包含引用類型時(shí),如果直接使用select語(yǔ)句進(jìn)行查詢,引用類型的列是一串?dāng)?shù)字碼,而且引用類型的對(duì)象無(wú)法直接訪問(wèn)其屬性。
select person_name,home_address from persons;
如果使用了deref函數(shù),則可以查詢到引用類型所指向的地址類型的值。
select person_name,deref (home_address) as home from persons;
在PL/SQL語(yǔ)句中使用ref類型的變量時(shí),不能直接訪問(wèn)對(duì)象的屬性,必須首先通過(guò)deref函數(shù)解除引用后,才能使用對(duì)象類型的屬性.
更新對(duì)象表
更新對(duì)象表時(shí)既可以把對(duì)象表看作是一個(gè)普通的關(guān)系型表,與關(guān)系表一樣把對(duì)象表中的每個(gè)屬性作為一列調(diào)用作為一列調(diào)用update語(yǔ)句,也可以將一行看作是一個(gè)對(duì)象,在update語(yǔ)句中對(duì)對(duì)象進(jìn)行賦值。
update emp_obj_table empobj set empobj.gender='M' where empobj.person_name='張小五';
另一種方法是直接更新一個(gè)對(duì)象表中的對(duì)象實(shí)例,因此需要先實(shí)例化一個(gè)對(duì)象實(shí)例。
update emp_obj_table empobj set empobj=employee_personobj('李曉琪','F',TO_DATE('1983-01-01','YYYY-MM-DD'),'眾泰',7981,7000,'Testing') where person_name='張小五';
在操縱對(duì)象表時(shí),還可以在where子句中把一行看作一個(gè)對(duì)象,可以使用對(duì)象標(biāo)識(shí)符來(lái)唯一標(biāo)識(shí)要更改的對(duì)象,對(duì)象標(biāo)識(shí)符是對(duì)象表中為了唯一標(biāo)識(shí)一條記錄而定義的一串?dāng)?shù)字值,對(duì)于一個(gè)對(duì)象來(lái)說(shuō),需要使用REF函數(shù)來(lái)獲取對(duì)象的標(biāo)識(shí)符,在where語(yǔ)句中使用對(duì)象類型進(jìn)行檢索的示例
在where子句中使用對(duì)象類型
declare
emp_refref employee_personobj; --定義引用對(duì)象類型
begin --從對(duì)象表中獲取對(duì)劉小燕的對(duì)象引用
select ref(e1) into emp_ref from emp_obj table e1 where person_name='劉小燕';
update emp_obj_table emp_obj set emp_obj=employee_personobj('何曉峰','F',TO_DATE('1985-08-01','YYYY-MM-DD'),'本田',7981,7000,'developer') where ref (emp_obj)=emp_ref;
end;
如果對(duì)象表的屬性列表中包含了引用類型,也就是說(shuō)包含了指向行對(duì)象數(shù)據(jù)的指針,如果要修改其列所引用的數(shù)據(jù),就必須修改相應(yīng)的行對(duì)象。例如在persons表中,home_address字段是一個(gè)指向address對(duì)象類型的引用,因此如果要update這個(gè)包含引用類型的表。
declare
addraddress;
begin
select deref(home_address) into addr from persons where person_name='張小五';
addr.street:='五一';
update address set street=addr.street where zip_code='21312';
end;
先使用deref函數(shù)返回指針?biāo)赶虻腶ddress對(duì)象實(shí)例的引用,然后將更改的信息更新回address表中就完成了對(duì)引用記錄的更改。
刪除對(duì)象表
與刪除普通表類似,對(duì)象表的刪除使用delete語(yǔ)句,下面的語(yǔ)句像刪除普通的關(guān)系表一樣刪除emp_obj_table表中員工名稱為張小五的記錄
delete from emp_obj_table where person_name='張小五';
與update類似,還可以在where子句中使用引用類型的對(duì)象進(jìn)行刪除。例如要?jiǎng)h除emp_obj_table表中員工名稱為劉小燕的記錄。
declare
emp_refref employee_personobj;
begin
select ref (e1) into emp_ref from emp_obj_table e1 where person_name='劉小燕'; --從對(duì)象表中獲取對(duì)劉小燕的對(duì)象引用
delete from emp_obj_table emp_obj where ref (emp_obj)=emp_ref
end; --使用delete語(yǔ)句刪除emp_obj_table表中劉小燕的記錄
通過(guò)使用ref函數(shù),將員工名稱為劉小燕的記錄進(jìn)行了正確的刪除。
創(chuàng)建對(duì)象列
除了將整個(gè)對(duì)象作為表中的列來(lái)存儲(chǔ)的對(duì)象表之外,還可以為關(guān)系表中的某一列的屬性指定為對(duì)象類型,這種表稱為帶對(duì)象列的關(guān)系表。這種帶對(duì)象類型的關(guān)系表與對(duì)象表的主要不同在于對(duì)象表時(shí)通過(guò)使用對(duì)象標(biāo)識(shí)符來(lái)引用對(duì)象實(shí)例的,而對(duì)于列對(duì)象來(lái)說(shuō)是沒有oracle對(duì)象標(biāo)識(shí)符的,列對(duì)象的對(duì)象實(shí)例屬于關(guān)系型數(shù)據(jù)庫(kù)中的記錄,具有一個(gè)rowid值作為標(biāo)識(shí)符。
定義dept_obj對(duì)象類型
create or replace type dept_obj as object(
deptnonumber(10),
dnamevarchar2(30),
locvarchar2(30),
MEMBER FUNCTION get_dept_info return varchar2
) INSTANTIABLE NOT FINAL;
定義對(duì)象類型體
create or replace type body dept_obj as
MEMBER FUNCTION get_dept_info return varchar2 is
begin
return '部門編號(hào):' || SELF.deptno ||'部門名稱:'||SELF.dname||'職位:'||SELF.loc;
end;
end;
對(duì)象類型dept_obj封裝了部門信息,可以看到具有部門編號(hào),部門名稱和部門的地址信息,接下來(lái)創(chuàng)建一個(gè)名為emp_colobj的表,該表用來(lái)存放員工信息,但是在部門列中,將使用dept_obj對(duì)象類型作為列類型,可以再表中存儲(chǔ)關(guān)于部門的詳細(xì)信息。
create table emp_colobj(
empnonumber(10) NOT NULL primary key,
enamevarchar2(30),
jobvarchar2(30),
salnumber(10,2),
deptcoldept_obj
) --dept列指定為dept_obj對(duì)象類型
在對(duì)象表中綁定了某個(gè)對(duì)象類型后,不能直接對(duì)對(duì)象表中的列及類型進(jìn)行操作,比如新增列或?qū)α羞M(jìn)行修改等,但是關(guān)系表中包含對(duì)象列類型則沒有這個(gè)限制,可以使用標(biāo)準(zhǔn)的ALTER TABLE語(yǔ)句來(lái)進(jìn)行操作.
使用對(duì)象視圖
為了創(chuàng)建一個(gè)對(duì)象視圖,必須首先創(chuàng)建一個(gè)與底層的數(shù)據(jù)表的列具有相匹配屬性的對(duì)象類型。
定義emp_tbl_obj對(duì)象類型
create or replace type emp_tbl_obj as object(
empnonumber(6),
enamevarchar2(10),
jobvarchar2(18),
mgrnumber(4),
hiredateDATE,
salnumber(7,2),
commnumber(7,2),
deptno number(2),
MEMBER FUNCTION get_emp_info return varchar2
)INSTANTIABLE NOT FINAL;
create or replace type body emp_tbl_obj as
MEMBER FUNCTION get_emp_info return varchar2 is
begin
return '員工編號(hào):' ||SELF.empno||'員工名稱:'||SELF.ename||'職位:'||SELF.job;
end;
end;
在創(chuàng)建對(duì)象視圖時(shí),必須要確定要使用的OID(對(duì)象標(biāo)識(shí)符).對(duì)象標(biāo)識(shí)符是用來(lái)唯一標(biāo)識(shí)一行對(duì)象的一個(gè)字符串,通過(guò)OID可以保證對(duì)對(duì)象實(shí)例引用的唯一性。OID標(biāo)識(shí)符僅在對(duì)象表和對(duì)象視圖上被創(chuàng)建,一旦一個(gè)OID被賦給了一個(gè)對(duì)象,那么將永遠(yuǎn)屬于那個(gè)對(duì)象。通常情況下,oracle會(huì)自動(dòng)產(chǎn)生OID值,不需要要手工干預(yù),但是在定義對(duì)象視圖時(shí),可以覆蓋系統(tǒng)產(chǎn)生OID的機(jī)制,更改為使用對(duì)象表的主鍵來(lái)替代.
create view view_name of object_name
with object identifier(primary_key)
as
sql_statement;
view_name指定對(duì)象視圖的名稱,object_name用于指定對(duì)象視圖的對(duì)象名稱,with object identifier用于指定OID方式,可以指定表的主鍵作為OID,sql_statement是對(duì)關(guān)系表的sql查詢語(yǔ)句時(shí)。
create view emp_view
of emp_tb1_obj
with object identifier(empno)
as
select e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno from emp e;
使用對(duì)象類型的視圖
declare
o_empemp_tb1_obj;
begin
--查詢對(duì)象類型
select value(e) into o_emp from emp_view e where empno=7369;
--輸出對(duì)象類型的屬性
dbms_output.put_line('員工'||o_emp.ename||'的薪資為:'||o_emp.sal);
dbms_output.put_line(o_emp.get_emp_info); --調(diào)用對(duì)象類型的成員方法
end;
管理對(duì)象類型
1.查看對(duì)象類型
COL type_name format A20;
select type_name,attributes,final,typecode from user_types where type_name like 'EMP%' and typecode='OBJECT';
通過(guò)使用select connect by語(yǔ)句,還可以根據(jù)type_name和supertype_name來(lái)查詢對(duì)象的繼承結(jié)構(gòu).
set pagesize 500;
select rpad (' ',3 * (LEVEL-1)) |from user_types where typecode='OBJECT' CONNECT BY PRIOR type_name=superty
2.修改對(duì)象類型
如果已經(jīng)基于對(duì)象類型建立了其他的對(duì)象類型或?qū)ο蟊?,那么在為?duì)象類型增加或刪除屬性時(shí),必須要使用cascade關(guān)鍵字.
--添加mgr屬性
alter type employee_personobj add attribute mgr number(6) cascade;
--刪除sal屬性
alter type employee_personobj drop attribute sal cascade;
修改對(duì)象類型的成員方法
alter type employee_personobj drop member function get_emp_info return varchar2 cascade;
--新增一個(gè)get_employee的成員方法
alter type employee_personobj add member function get_employee return varchar2 cascade;
--更改對(duì)象類型體,以便增加在對(duì)象類型規(guī)范中定義的方法
create or replace type body employee_personobj as
member function get_employee return varchar2 is
begin
return '員工編號(hào):' ||SELF.empno||'員工名稱:'||SELF.person_name||'職位:'||SELF.job;
end;
end;
如果從基類刪除一個(gè)方法,那么也必須修改覆蓋被刪除方法的子類,可以用alter type 的casade選擇來(lái)判斷是否有子類被影響到:如果有子類覆蓋了方法,那么語(yǔ)句被回滾。為了能成功地從基類刪除一個(gè)方法。
1.先從子類刪除方法
2.從基類刪除方法,然后用不帶overriding關(guān)鍵字的alter type把它重新添加進(jìn)去.
分享題目:PLSQL面向?qū)ο缶幊?/a>
URL標(biāo)題:http://muchs.cn/article44/ipipee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站內(nèi)鏈、微信小程序、網(wǎng)站制作、標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)