PL / SQL面向对象
的PL / SQL允许定义一个对象类型,这有助于在甲骨文设计的面向对象的数据库。对象类型可以让你的箱子复合类型。使用对象允许您实现数据的特定结构现实世界中的对象和方法操作它。对象有属性和方法。属性是一个对象的属性,并用于存储对象的状态;和方法用于模拟其行为。
对象是使用CREATE [OR REPLACE] TYPE语句创建。下面是创建包含一些属性的简单地址对象的例子:
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.
让我们再创建一个对象的客户 ,我们将包的属性和方法 ,共同拥有的面向对象的感觉:
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');
比较方法被用于比较对象。有两种方法来比较对象:
图法 : 图方法是在它的值取决于属性的值这样的方式实现的功能。例如,一个客户对象,如果客户代码是相同为两个客户,无论客户可能是相同的,一个。所以这两个对象之间的关系将取决于代码的值。
订购方法 : 订单方式实现一些内部逻辑比较两个对象。例如,对于矩形对象,矩形比另一个矩形更大如果在其两侧都更大。
使用方法地图
让我们试着去了解上面使用下面的矩形对象的概念:
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.
使用方法订购
现在,具有相同的效果可以使用顺序方法来实现 。让我们用命令的方法重新创建矩形对象:
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对象:
PL / SQL允许从现有的基础对象创建的对象。为了实现继承,基本对象应声明为没有最终确定。默认是最终决定。
下面的程序说明了在PL / SQL对象继承。让我们创建一个名为桌面型另一个对象,这是从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.
使用桌面对象及其成员函数:
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.
在PL / SQL抽象对象
在不实例化子句允许你声明一个抽象的对象。因为这是你不能使用抽象对象;你必须创建这些对象的子类型或子类型使用其功能。
例如,
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.