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');

比较方法被用于比较的对象。有两种方法来比较对象:

  • 映射方法:映射方法它的值取决于属性的值,以这样的方式实现函数。例如,一个客户对象,如果客户代码是相同的两个客户,可以认为是相同的一个。所以这两个对象之间的关系将取决于代码的值。

  • 顺序方法:顺序方法实现一些内部逻辑比较两个对象。例如,对于矩形(rectangle)对象,如果其两侧都大,则表示矩形(rectangle)大于另一个矩形(rectangle)。

使用映射方法

让我们试着去了解上面使用下面的矩形对象的概念:

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.

现在,使用矩形(rectangle)对象及其成员函数:

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.

使用顺序的方法

现在,相同的效果可以使用顺序方法来实现。让我们用一个顺序方法重新创建矩形(rectangle)对象:

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.

使用矩形(rectangle)对象及其成员函数:

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.

SQL记录-PLSQL面向对象的更多相关文章

  1. SQL记录-PLSQL记录

    PL/SQL记录   PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行. 例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题 ...

  2. SQL记录-PLSQL基本语法与数据类型

    PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...

  3. SQL记录-PLSQL游标

    PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...

  4. SQL记录-PLSQL条件控制

    PL/SQL条件控制   决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. 以下是从在大 ...

  5. SQL记录-PLSQL变量与常量文字

    PL/SQL变量   变量是只不过是一个给定的存储区域,程序可以操纵的名称.PL/SQL每个变量具有一个特定的数据类型,它决定了大小和变量的存储器的值,可以说存储器和设置操作可以施加到可变内被存储的范 ...

  6. SQL记录-PLSQL包

    PL/SQL包 PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象. 程序包将有两个强制性的部分: 包装规范定义 包体或定义 包装规范定义 规范是接口到包.它只是声明的类型,变量,常量 ...

  7. SQL记录-PLSQL触发器

    PL/SQL触发器 触发器是存储程序,它会自动执行或发射当一些事件发生.触发器,事实上,写入响应于以下任一事件将被执行: 数据库操作(DML)语句(DELETE,INSERT,UPDATE或) 数据库 ...

  8. SQL记录-PLSQL函数

    PL/SQL函数 PL/SQL函数与过程相同,不同之处在于函数有一个返回值.因此,前面的章节中的所有讨论都适用于函数. 创建函数 建立一个独立函数可以使用CREATE FUNCTION语句创建.CRE ...

  9. SQL记录-PLSQL过程

    PL/SQL过程   子程序是一个程序单元/模块执行特定的任务.这些子程序被组合以形成更大的程序.这基本上是被称为“模块化设计”.子程序可以调用由另一个子程序或程序被称为调用程序. 子程序可以创建: ...

随机推荐

  1. R语言学习 第二篇:矩阵和数组

    向量是一维的,只有行这一个维度,没有其他维度.R可以创建更高维度的数据对象,例如,矩阵.数据框.数组,索引高维度的对象时,需要使用元素的下标.这些对象的下标都使用中括号[]和索引,第一个维度是row, ...

  2. startActivity时报错Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVI

    原代码如下: Intent intent = new Intent(); intent.setClass(mContext, PhotoView.class); Bundle bundle = new ...

  3. [摘抄]从 GitHub 身上学到的 3 个创业经验

    1.找一个大问题去解决 让 Git 更容易使用是 GitHub 的目标,但它从来不是 GitHub 的最终目标.GitHub 的真正目标是让协作和编写软件变得更容易.世界上每一个软件开发者都在努力解决 ...

  4. 使用unity3d和tensorflow实现基于姿态估计的体感游戏

    使用unity3d和tensorflow实现基于姿态估计的体感游戏 前言 之前做姿态识别,梦想着以后可以自己做出一款体感游戏,然而后来才发现too young.但是梦想还是要有的,万一实现了呢.趁着p ...

  5. Web Workers文档

    Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法.线程可以执行任务而不干扰用户界面.此外,他们可以使用XMLHttpRequest执行 I/O  (尽管responseXML和 ...

  6. 【机器学习】Apriori算法——原理及代码实现(Python版)

    Apriopri算法 Apriori算法在数据挖掘中应用较为广泛,常用来挖掘属性与结果之间的相关程度.对于这种寻找数据内部关联关系的做法,我们称之为:关联分析或者关联规则学习.而Apriori算法就是 ...

  7. PAT甲题题解-1041. Be Unique (20)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789189.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  8. Daily Scrumming* 2015.12.13(Day 5)

    一.团队scrum meeting照片 二.今日总结 姓名 WorkItem ID 工作内容 签入链接以及备注说明  江昊 任务1063 查找与学习前端工具库,并写出一篇指导文档 https://gi ...

  9. 派生类&简单工厂模式

    派生类&简单工厂模式 git链接: Operation3.1.1 题目描述的代码部分的解释 首先是声明一个Rand类作为父类,然后两个子类RandNumber类和RandOperation类, ...

  10. 云平台项目--学习经验--jsrender前端渲染模板

    jsrender的好处:可以预先自定义一些固定的html标签,在需要显示数据的时候,可以直接传入真实的数据并显示在web页面中,避免了Js编写中的复杂过程:针对高性能和纯字符串渲染并优化,不需要依赖D ...