PLSQL面向?qū)ο缶幊?/h1>

面向?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)

成都app開發(fā)公司