首页 > 数据库 >无涯教程-PL/SQL - 面向对象

无涯教程-PL/SQL - 面向对象

时间:2023-12-23 10:02:29浏览次数:35  
标签:END 对象 无涯 number PL SQL display rectangle

在本章中,无涯教程将讨论面向对象的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

相关文章

  • centos7_mysql_删除
    CentOS7中的MySQL是使用以下命令进行安装的:sudoyuminstallmysql-server以下是如何完全卸载MySQL的步骤:步骤1:停止MySQL服务sudosystemctlstopmysqld.service步骤2:禁用MySQL服务,使它不会在系统重启时启动sudosystemctldisablemysqld.service步骤3:卸......
  • kaggle Open Problems – Single-Cell Perturbations 1st & 2nd place solution summa
    Leaderboard:https://www.kaggle.com/competitions/open-problems-single-cell-perturbations/leaderboard2ndSolution:https://www.kaggle.com/competitions/open-problems-single-cell-perturbations/discussion/458738Code:https://github.com/Eliorkalfon/single_ce......
  • MySQL-explain篇
    工具介绍模拟优化器执行SQL语句分析你的查询语句或是结构的性能瓶颈执行查询会返回执行计划的信息from中包含子查询,仍会执行该子查询,将结果放入临时表中typesystem:system是const的特例const:读取一次eq_ref:primarykey或uniquekey索引的所有部分被连接使用,最多只......
  • 浅谈C++STL(Standard Template Library,标准模板库)
    2.1STL的诞生长久以来,软件界一直希望建立一种可重复利用的东西C++的面向对象和泛型编程思想,目的就是复用性的提升大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准,诞生了STL2.2STL基本概念STL(StandardTemplateLibrary,标......
  • 无涯教程-PL/SQL - 触发器(Triggers)
    在本章中,无涯教程将讨论PL/SQL中的触发器,触发器是存储的程序,在发生某些事件时会自动执行或触发。创建触发器创建触发器的语法是-CREATE[ORREPLACE]TRIGGERtrigger_name{BEFORE|AFTER|INSTEADOF}{INSERT[OR]|UPDATE[OR]|DELETE}[OFcol_name]ONt......
  • Plotly,一个超强的Python可视化库!
    数据可视化是数据分析和探索的一个重要方面,它有助于深入了解数据集中的潜在模式、趋势和关系。Plotly则是一个功能强大且多功能的Python库,提供了广泛的工具来创建交互式且具有视觉吸引力的绘图。它支持多种图表类型,包括散点图、折线图、条形图等。Plotly的独特之处在于它能......
  • 无涯教程-PL/SQL - 记录(Records)
    在本章中,无涯教程将讨论PL/SQL中的记录(Records)。记录是一种数据结构,可以容纳不同种类的数据项。记录由不同的字段组成,类似于数据库表的一行。PL/SQL可以处理以下类型的记录-基于表的记录  (Table-basedrecords)基于游标的记录(Cursor-basedrecords)用户定义的记录(U......
  • template
    modintconstintmod=998244353;structmint{ intx; mint(intx=0):x(x){} mint&operator+=(minta){if((x+=a.x)>=mod)x-=mod;return*this;} mint&operator-=(minta){if((x-=a.x)<0)x+=mod;return*this;} mint&operator*=(minta){x=(ll)x*a.x%......
  • mysql报错:Duplicate entry ‘...‘ for key ‘field‘
    错误信息"Duplicateentry'...'forkey'field'"表示在数据库表中,你正在尝试插入一条数据的'number'字段的值已经存在。这通常是由于你设置了'field'字段为唯一键(UNIQUEKEY),而你又尝试插入一个已存在的值。解决这个问题的方法有以下几种:检查输入的数据:确保你插入的数据在该字段......
  • mysql 报错 Duplicate entry ‘xxx‘ for key ‘字段名‘
    有时候对表进行操作,例如加唯一键,或者插入数据(已经有唯一键),会报错Duplicateentry...forkey...原因是primarykey(主键)或uniquekey(唯一键)的值重复。还有索引也会导致。碰到这种情况,考虑是否需要主键或唯一键的约束,如果不需要,就直接删除约束。在navicat上有√可以选。命令行如下删除......