当前位置: 首页 > 教程 > PL/SQL >

PL/SQL面向对象

精华
小牛编辑
129浏览
2023-03-14

在本章中,我们将讨论面向对象的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提示符下执行时,它会产生以下结果 -

类型已创建。

下面再创建另一个对象:customer,将属性和方法包装在一起,以具有面向对象的感觉 -

CREATE OR REPLACE TYPE customer AS OBJECT 
(
 code number(5), 
 name varchar2(30), 
 contact_no varchar2(12), 
 addr address, 
 member procedure display 
); 
/

当上面的代码在SQL提示符下执行时,它会产生以下结果 -

类型已创建。

实例化对象

定义对象类型为对象提供模板(或蓝图)。要使用这个对象,需要创建这个对象的实例。可以使用实例名称和访问运算符(.)来访问对象的属性和方法,如下所示 -

SET SERVEROUTPUT ON SIZE 9999;
DECLARE 
   residence address; 
BEGIN 
   residence := address('1502A', '人民大道', '海口', '海南','201901'); 
   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('Province: '|| residence.state); 
   dbms_output.put_line('Pincode: '|| residence.pincode); 
END; 
/

执行上面示例代码,得到以下结果 -

成员方法

成员方法用于操作对象的属性。在声明对象类型的同时提供成员方法的声明。 对象体定义了成员方法的代码。对象正文是使用CREATE TYPE BODY语句创建的。

构造函数是返回一个新对象作为其值的函数。每个对象都有一个系统定义的构造方法。构造函数的名称与对象类型相同。 例如 -

residence := address('1502A', '人民大道', '海口', '海南','201901');

比较方法用于比较对象。 有两种方法来比较对象 -

映射方法

Map方法是一个函数,它的值取决于属性的值。 例如,对于客户对象,如果客户代码对于两个客户是相同的,则两个客户可以是相同的。 所以这两个对象之间的关系将取决于代码的值。

排序方法

排序方法实现了一些用于比较两个对象的内部逻辑。例如,对于一个矩形对象,如果矩形的两边都较大,则矩形比另一个矩形大。

使用Map方法

下面尝试使用以下矩形对象来了解上述概念 -

SET SERVEROUTPUT ON SIZE 999999;
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提示符下执行时,它会产生以下结果 -

类型已创建。

接下来,创建类型主体 -

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; 
/

执行上面示例代码,得到以下输出结果 -

类型主体已创建。

现在使用矩形对象及其成员函数 -

SET SERVEROUTPUT ON SIZE 99999;
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; 
/

执行上面示例代码,得到以下输出结果 -

使用排序方法

现在,使用排序方法可以达到同样的效果。下面来看看如使用排序方法重新创建矩形对象 -

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(
  length number, 
  width number, 
  member procedure display, 
  order member function measure(r rectangle) return number 
); 
/

当上面的代码在SQL提示符下执行时,它会产生以下结果 -

类型已创建。

创建类型主体 -

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; 
/

执行上面示例代码,得到以下结果 -

类型主体已创建。

使用矩形对象及其成员函数 -

SET SERVEROUTPUT ON SIZE 99999;
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; 
/

执行上面示例代码,得到以下结果 -

PL/SQL对象的继承

PL/SQL允许从现有的基础对象创建对象。为了实现继承,基类对象应该声明为NOT FINAL。默认是FINAL

以下程序演示了PL/SQL对象中的继承。首先创建另一个名为TableTop对象,它是从Rectangle对象继承的。因此,需要创建这个基础的Rectangle对象,参考以下代码 -

CREATE OR REPLACE TYPE  rectangle FORCE AS OBJECT 
(
  length number, 
  width number, 
  member function enlarge( inc number) return rectangle, 
  NOT FINAL member procedure display) NOT FINAL 
/

执行上面示例代码,得到以下结果 -

类型已创建。

创建基本类型的主体 -

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; 
/

执行上面示例代码,得到以下结果 -

类型主体已创建。

创建子对象tabletop -

CREATE OR REPLACE TYPE tabletop UNDER rectangle 
(   
   material varchar2(20), 
   OVERRIDING member procedure display 
) 
/

执行上面示例代码,得到以下结果 -

类型已创建。

为子对象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; 
/

执行上面示例代码,得到以下结果 -

类型主体已创建。

使用tabletop对象及其成员函数 -

DECLARE 
   t1 tabletop; 
   t2 tabletop; 
BEGIN 
   t1:= tabletop(20, 10, 'Wood'); 
   t2 := tabletop(50, 30, 'Steel'); 
   t1.display; 
   t2.display; 
END;
/

当执行上面示例代码时,得到以下结果 -

Length: 20 
Width: 10 
Material: Wood 
Length: 50 
Width: 30 
Material: Steel

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提示符下执行时,它会产生以下结果 -

类型已创建。

最后更新:

类似资料

  • 主要内容:包规范,包体,使用包元素在本章中,我们将讨论PL/SQL中的包。 包是模式对象,将逻辑上相关的PL/SQL类型,变量和子程序分组。 一个包将有两个强制性的部分 - 包规范/格式 包体或定义 包规范 规范是包的接口。它只是声明可以从包外部引用的类型,变量,常量,异常,游标和子程序。 换句话说,它包含有关包的内容的所有信息,但不包括子程序的代码。 所有放置在规范中的对象被称为公共对象。任何不在包规范中但在包体中编码的子程序称

  • 主要内容:开始和结束事务,提交事务,回滚事务,自动事务控制在本章中,我们将讨论和学习PL/SQL中的事务。 数据库事务是由一个或多个相关SQL语句组成的原子工作单元。它被称为原子操作,因为构成事务的SQL语句带来的数据库修改可以共同提交,即永久化到数据库或从数据库回滚(撤销)。 成功执行的SQL语句和提交的事务不一样。即使成功执行SQL语句,除非提交包含语句的事务,否则可以回滚该语句,并且可以撤消语句所做的所有更改。 开始和结束事务 事务有开始和结束。当

  • 主要内容:索引表,示例,嵌套表,集合方法,集合异常在本章中,我们将讨论PL/SQL中的集合。集合是具有相同数据类型的有序元素组。 每个元素都由一个唯一的下标来表示它在集合中的位置。 PL/SQL提供了三种集合类型 - 索引表或关联数组 嵌套的表 可变大小的数组或类型 Oracle的每种类型的集合有以下特征 - 集合类型 元素个数 下标类型 密集或稀疏 在哪创建 是否为对象类型属性 关联数组(或索引表) 无界 字符串或整数 任意一种 只在PL/SQ

  • 主要内容:基于表的记录,基于游标的记录,用户定义的记录,将记录作为子程序参数在本章中,我们将讨论和学习PL/SQL中的记录。 记录是可以容纳不同种类的数据项的数据结构。 记录由不同的字段组成,类似于数据库表的一行。 例如,想要在图书馆中跟踪记录图书信息。可能希望跟踪每本书的以下属性,例如标题,作者,主题,图书ID。 包含每个这些项目的字段的记录允许将图书视为逻辑单元,并允许以更好的方式组织和表示其信息。 PL/SQL可以处理以下类型的记录 - 基于表的记录 基于游标的记录

  • 主要内容:隐式游标,显式游标在本章中,我们将讨论和学习中的游标。 Oracle创建一个称为上下文区域的内存区域,用于处理SQL语句,它包含处理该语句所需的所有信息; 例如,处理的行数等。 游标是指向此上下文区域的指针。通过游标控制上下文区域,游标保存SQL语句返回的行(一个或多个)。 游标所在的行集称为活动集。 可以命名一个游标,以便在程序中引用它来获取和处理SQL语句返回的行,一次处理一个(行)。PL/SQL中有两种类型的

  • 主要内容:1. 创建函数,2. 调用函数,3. PL/SQL递归函数在本章中,我们将讨论和学习PL/SQL中的函数。函数与过程(也叫程序)相同,只不过函数有返回一个值,而过程没有返回值。 因此,上一章中所有有关存储过程的内容也适用于函数。 1. 创建函数 使用语句创建独立函数。语句的简化语法如下: 其中, function-name是指定要创建的函数的名称。 [OR REPLACE]选项指示是否允许修改现有的函数。 可选参数列表包含参数的名称,模式和类型。 表示将