在本章中,无涯教程将讨论面向对象的PL/SQL,PL/SQL允许定义对象类型,这有助于在Oracle中设计面向对象的数据库,对象类型允许您创建复合类型。
使用CREATE [OR REPLACE] TYPE语句创建对象,以下是创建由几个属性组成的简单 address 对象的示例-
CREATE OR REPLACE TYPE address AS OBJECT (house_no varchar2(10), street varchar2(30), city varchar2(20), state varchar2(10), pincode varchar2(10) ); /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type created.
让无涯教程再创建一个对象 customer ,在其中将属性和方法包装在一起,从而具有面向对象的感觉-
CREATE OR REPLACE TYPE customer AS OBJECT (code number(5), name varchar2(30), contact_no varchar2(12), addr address, member procedure display ); /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type created.
实例化对象
要使用此对象,您需要创建该对象的。您可以使用名称和访问运算符(.)来访问对象的属性和方法,如下所示-
DECLARE residence address; BEGIN residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301'); dbms_output.put_line('House No: '|| residence.house_no); dbms_output.put_line('Street: '|| residence.street); dbms_output.put_line('City: '|| residence.city); dbms_output.put_line('State: '|| residence.state); dbms_output.put_line('Pincode: '|| residence.pincode); END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
House No: 103A Street: M.G.Road City: Jaipur State: Rajasthan Pincode: 201301 PL/SQL procedure successfully completed.
对象方法
您可以在声明对象类型时提供方法的声明,对象主体定义方法的代码,使用CREATE TYPE BODY语句创建对象主体。
构造函数是返回新对象作为其值的函数,每个对象都有一个系统定义的构造方法,构造函数的名称与对象类型相同。如-
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
比较方法用于比较对象。比较对象有两种方法-
Map 方法 - Map方法是一种功能,其值取决于属性的值。
Order 方法 - Order方法实现了一些用于比较两个对象的内部逻辑。
使用Map方法
让无涯教程尝试使用以下矩形对象来理解以上概念:
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, member function enlarge( inc number) return rectangle, member procedure display, map member function measure return number ); /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type created.
创建类型主体-
CREATE OR REPLACE TYPE BODY rectangle AS MEMBER FUNCTION enlarge(inc number) return rectangle IS BEGIN return rectangle(self.length + inc, self.width + inc); END enlarge; MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); END display; MAP MEMBER FUNCTION measure return number IS BEGIN return (sqrt(length*length + width*width)); END measure; END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type body created.
现在使用矩形对象及其函数-
DECLARE r1 rectangle; r2 rectangle; r3 rectangle; inc_factor number := 5; BEGIN r1 := rectangle(3, 4); r2 := rectangle(5, 7); r3 := r1.enlarge(inc_factor); r3.display; IF (r1 > r2) THEN -- calling measure function r1.display; ELSE r2.display; END IF; END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Length: 8 Width: 9 Length: 5 Width: 7 PL/SQL procedure successfully completed.
使用Order方法
现在,使用Order方法可以实现相同的效果。让无涯教程使用order方法重新创建矩形对象-
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, member procedure display, order member function measure(r rectangle) return number ); /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type created.
创建类型主体-
CREATE OR REPLACE TYPE BODY rectangle AS MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); END display; ORDER MEMBER FUNCTION measure(r rectangle) return number IS BEGIN IF(sqrt(self.length*self.length + self.width*self.width)> sqrt(r.length*r.length + r.width*r.width)) then return(1); ELSE return(-1); END IF; END measure; END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type body created.
使用矩形对象及其函数-
DECLARE r1 rectangle; r2 rectangle; BEGIN r1 := rectangle(23, 44); r2 := rectangle(15, 17); r1.display; r2.display; IF (r1 > r2) THEN -- calling measure function r1.display; ELSE r2.display; END IF; END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Length: 23 Width: 44 Length: 15 Width: 17 Length: 23 Width: 44 PL/SQL procedure successfully completed.
对象继承
PL/SQL允许从现有基础对象创建对象,要实现继承,应将基础对象声明为 NOT FINAL ,默认值为 FINAL 。
以下程序说明了PL/SQL对象中的继承,让无涯教程创建另一个名为 TableTop 的对象,该对象继承自Rectangle对象,为此无涯教程需要创建基本的 rectangle 对象-
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, member function enlarge( inc number) return rectangle, NOT FINAL member procedure display) NOT FINAL /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type created.
创建基本类型主体-
CREATE OR REPLACE TYPE BODY rectangle AS MEMBER FUNCTION enlarge(inc number) return rectangle IS BEGIN return rectangle(self.length + inc, self.width + inc); END enlarge; MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); END display; END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type body created.
创建子对象桌面-
CREATE OR REPLACE TYPE tabletop UNDER rectangle ( material varchar2(20), OVERRIDING member procedure display ) /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type created.
为子对象桌面创建类型主体
CREATE OR REPLACE TYPE BODY tabletop AS OVERRIDING MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); dbms_output.put_line('Material: '|| material); END display; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type body created.
使用 tabletop 对象及其函数-
DECLARE t1 tabletop; t2 tabletop; BEGIN t1:= tabletop(20, 10, 'Wood'); t2 := tabletop(50, 30, 'Steel'); t1.display; t2.display; END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Length: 20 Width: 10 Material: Wood Length: 50 Width: 30 Material: Steel PL/SQL procedure successfully completed.
抽象对象
NOT INSTANTIABLE 子句允许您声明抽象对象,您不能按原样使用抽象对象,您将必须创建此类对象的子类型或子类型以使用其功能。
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display) NOT INSTANTIABLE NOT FINAL /
当以上代码在SQL提示符下执行时,将产生以下输出-
Type created.
参考链接
https://www.learnfk.com/plsql/plsql-object-oriented.html
标签:END,对象,无涯,number,PL,SQL,display,rectangle From: https://blog.51cto.com/u_14033984/8944516