ORACLE PL/SQL 对象(object)学习笔记(一)

本文详细介绍了Oracle PL/SQL中的对象类型,包括对象类型规范、属性和方法的声明,以及复合对象类型。重点讲解了属性的限制、方法的分类(如MEMBER、STATIC、CONSTRUCTOR)以及构造函数的使用。此外,还讨论了对象类型主体、SELF参数、MAP和ORDER方法的功能。最后,探讨了如何更改和删除对象类型。

 1、对象类型规范

 

创建对象类型规范的语法如下

 

 

 

 

其中AUTHID指示将来执行该方法时,必须使用在创建时定义的CURRENT_USERDEFINER的权限集合。CURRENT_USER是调用该方法的用户,DEFINER是该对象类型的所有者。

 

 

1)属性

属性的声明有一些限制,包括:

 

  • 属性的声明必须出现在方法的声明以前。
  • 数据类型可以是任何数据库数据类型,但是不能包括ROWID,UROWID,LONG,LONG RAW,NCHAR,NCLOB,NVARCHAR2类型,以及PL/SQL的专用类型或在PL/SQL包中定义的类型。
  • 不能使用那些只能在PL/SQL中使用而不能在数据库中使用的数据类型。这些类型包括BINARY_INTEGER,BOOLEAN,PLS_INTEGER,RECORDREF CURSOR
  • 不能使用NOT NULL约束,但是可以通过在对象实例上定义一个数据库触发器来达到相同效果。
  • 属性列表中至少必须有一个属性。
  • 不能使用默认值。

 

注意:不能直接在属性或对象类型上使用%TYPE%ROWTYPE。但是可以在对象实例的属性上使用它们。

 

  

 

复合对象类型

 

复合对象类型可以以某个属性的数据类型的形式,包含另一个对象类型。

 

  

 

2)方法

方法就是过程或函数,它们是在属性声明之后进行声明的。声明方法的拓展语义如下

 

 

  

 

该声明和包规范的声明没有太多的区别。二者之间的主要差别是STATIC,CONSTRUCTORMEMBER关键字的使用。MAPORDER的作用是确定对象类型的排列顺序。

 

MEMBER方法

成员方法是基于对象实例调用的,而不是基于对象类型调用的。

 

STATIC方法

静态方法独立于对象实例,也不能在对象类型主体中引用这个对象的属性。

 

CONSTRUCTOR方法

到目前为止,我们只看到了显式声明的成员方法和静态方法,它们通过过程或函数作用于对象属性。另一方面,构造函数一直都是系统定义的函数,函数返回一个实例化的对象,并带有一些参数,这些参数就是相应对象的属性值。ORACLE为每一个对象类型都预定义了一个构造函数,这个方法的名称和属性与对象类型相同。

但是,从ORACLE 9i R2开始,ORACLE开始允许用户自定义构造函数,这种用户自定义的构造函数使我们可以重写系统定义的构造函数,或者添加其他的构造函数。

 

 

2、对象类型主体

对象类型主体与包类似。规范是由属性和方法的声明组成的,只有方法是在对象类型主体中实现的,如果对象类型规范中只包含属性,那么就不需要对象类型主体了。

 

创建对象类型主体的语法如下

 

 

 

 

1SELF参数

关键字SELF引用当前对象实例。像JAVA语言的THIS关键字一样,可以使用它引用整个对象,也可以使用它引用当前对象的方法或属性。

 

SELF被自动声明为MEMBER方法的第一个参数,默认时,如果没有进行显式地限定,在MEMBER函数中整个参数的模式为IN,在MEMBER过程中这个参数的模式为IN OUT

不能将其声明为OUT模式,另外,SELF还必须与原始对象的数据类型相同。

 

就实例来说,没有必要包含SELF关键字,因为默认时对属性的引用使用的就是当前对象。

 

如下例所示

 

 

 

 

虽然在上面这个示例中SELF作为它的一个可选关键字,可是在用户自定义构造函数还必须在返回子句中使用RETURN SELF AS RESULT。

 

 

 

 

 

试图在返回语句中使用除了SELF以外的任何语句,都会引发下面的异常

 

PLS-00659 : constructor method must return SELF AS RESULT

 

2MAPORDER 方法

MAPORDER方法可以对两个对象进行比较。在这里首先给出适用于这二者的公共规则:

  • 每个对象上最多只能允许有一个MAPORDER方法。
  • 不能在同一个对象上既定义MAP方法,又定义ORDER方法。
  • MAPORDER方法可以比较程序代码中的两个对象。如果没有使用它们,比较程序代码中的两个对象就会引发异常。但是,在SQL语句中仍然可以进行相等性比较,因为这种比较只是比较对象的每一个属性。

 

MAP方法

ORACLE需要比较两个对象(布尔比较),或使用GROUP BY,ORDER BY,DISTINCT子句比较对象的时候,它就会调用MAP函数,将对象转换为可以存储的类型。在使用大群对象的时候,MAP方法就比ORDER方法更加有效,因为它将整个对象集转换为一种更简单的类型(以散列函数的形式进行操作),然后再对这种类型进行排序。MAP方法只带一个SELF参数,返回类型是DATE,NUMBER,VARCHAR2,CHARREAL的标量类型。

 

下面看一个使用MAP的示例

 

 

ORDER方法

ORDER方法与MAP方法在功能上非常相似,但是它们的执行有些细微的区别。该方法的输入参数的数据类型是一个对象类型的参数,返回类型只能是NUMBER类型。

 

同样对于上面MAP方法的那个示例,用ORDER来实现,如下所示

 

  

 

3、更改和删除类型

和其他类型数据类型相类似,你可以通过ALTER TYPE语句修改现有的对象类型。ALTER TYPE可以被用于编译类型规范或主体,或者向类型中添加方法。也可以使用DROP TYPE来删除类型。

 

1ALTER TYPE…COMPILE

 

命令格式如下

 

ALTER TYPE type_name COMPILE[SPECIFICATION | BODY];

 

如果没有指定[SPECIFICATION | BODY],那么规范和主体都将被重新编译。

 

2ALTER TYPE … REPLACE AS OBJECT

 

命令格式如下

 

ALTER TYPE type_name REPLACE AS OBJECT(object_type_specification);

 

这里的object_type_specification是一个完全的类型定义,这和在CREATE TYPE命令中定义是一样的。新的定义必须和旧的定义是完全一样的,除了新添加的方法以外。如果该类型的主体存在,那么它还并未生效的,因为没有在类型主体中定义新方法。

 

下面的例子说明了该命令的使用方法

 

 

还可以给已有的类型添加或者删除属性

ALTER TYPE cd_obj

ADD ATTRIBUTE subtitle VARCHAR2(20)

 

ALTER TYPE cd_obj

DROP ATTRIBUTE subtitle

 

3DROP TYPE

命令格式如下

 

DROP TYPE [schema.] type_name [FORCE];

 

如果FORCE选项没有被指定,那么仅当所有其他数据模式对象都不依赖于在命令中指定的对象类型时才会删除该对象类型。如果指定了FORCE选项,那么该对象将被删除,这有可能会使得其他依赖于该对象的其他对象失效。

 

DROP TYPE BODY可以用来仅仅删除对象类型的主体,但是规范和所有依赖对象保持不变,其命令格式如下

 

DROP TYPE BODY[schema.] type_name

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值