PL/SQL - 面向对象

  • 简述

    在本章中,我们将讨论面向对象的 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 我们将在哪里包装 attributesmethods 共同拥有面向对象的感觉 -
    
    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.
    
  • 实例化一个对象

    定义对象类型提供了对象的蓝图。要使用此对象,您需要创建此对象的实例。您可以使用实例名称访问对象的属性和方法the access operator (.) 如下 -
    
    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. 
    
  • 成员方法

    Member methods 用于操纵 attributes的对象。您在声明对象类型时提供成员方法的声明。对象主体定义了成员方法的代码。对象主体是使用 CREATE TYPE BODY 语句创建的。
    Constructors是返回一个新对象作为其值的函数。每个对象都有一个系统定义的构造函数方法。构造函数的名称与对象类型相同。例如 -
    
    residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301'); 
    
    比方方法用于比较对象。有两种比较对象的方法 -

    Map方法

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

    Order方法

    Order 方法实现一些内部逻辑来比较两个对象。例如,对于一个矩形对象,如果一个矩形的两边都大,那么它就比另一个矩形大。
  • 使用地图方法

    让我们尝试使用以下矩形对象来理解上述概念 -
    
    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 对象继承的。为此,我们需要创建基础矩形对象 -
    
    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.