- PL/SQL 教程
- PL/SQL - 首页
- PL/SQL - 概述
- PL/SQL - 环境
- PL/SQL - 基本语法
- PL/SQL - 数据类型
- PL/SQL - 变量
- PL/SQL - 常量和字面量
- PL/SQL - 运算符
- PL/SQL - 条件语句
- PL/SQL - 循环语句
- PL/SQL - 字符串
- PL/SQL - 数组
- PL/SQL - 过程
- PL/SQL - 函数
- PL/SQL - 游标
- PL/SQL - 记录
- PL/SQL - 异常处理
- PL/SQL - 触发器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事务
- PL/SQL - 日期和时间
- PL/SQL - DBMS 输出
- PL/SQL - 面向对象
- PL/SQL 有用资源
- PL/SQL - 问答
- PL/SQL - 快速指南
- PL/SQL - 有用资源
- PL/SQL - 讨论
PL/SQL - 面向对象
本章将讨论面向对象的 PL/SQL。PL/SQL 允许定义对象类型,这有助于在 Oracle 中设计面向对象的数据库。对象类型允许您创建复合类型。使用对象允许您实现现实世界中的对象,这些对象具有特定的数据结构和操作它的方法。对象具有属性和方法。属性是对象的特性,用于存储对象的状态;方法用于模拟其行为。
对象是使用 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');
比较方法用于比较对象。有两种比较对象的方法:
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 对象的继承
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.
创建子对象tabletop:
CREATE OR REPLACE TYPE tabletop UNDER rectangle ( material varchar2(20), OVERRIDING member procedure display ) /
当以上代码在 SQL 提示符下执行时,它会产生以下结果:
Type created.
创建子对象tabletop的类型主体
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.
PL/SQL 中的抽象对象
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.