提示:公众号展示代码会自动换行,建议横屏阅读或左右滑动代码

一 对象类型简介
对象类型是用户自定义的复合数据类型,它包括属性和方法两个部分组成,其中属性用于描述对象所具有的特征,方法用于实现对象操作。数据库对象类型和Java,C++等高级编程语言中的对象类似。但各种语言之间有一定的区别。
1.对象类型属性
当定义对象类型属性时,需要提供属性名和属性数据,但不能指定属性默认值和NOT NULL选项。注意,属性不能使用以下数据类型:
(1) LONG和LONG RAW.
(2) ROWID和UROWID.
(3) BOOLEAN, %TYPE, %ROWTYPE.
2.对象类型方法
对象类型方法用于描述对象所要执行的操作。当定义对象类型时,既可以定义方法,也可以不定义方法。在定义对象类型时,可以定义构造方法,MEMBER方法,STATIC方法,MAP方法以及ORDER方法。
3.对象实例
对象实例(Object Instance)是对象类型在现实世界中的具体表现形式。例如,雇员SCOTT和SMITH是对象类型employee_type的两个对象实例。
4.对象函数
对象函数用于操作REF对象。REF实际是指向对象实例的指针,也称为参考对象,下面介绍这些对象函数的作用:
(1) DEREF(expr):该函数用于返回参照对象所引用的对象实例。
(2) MAKE_REF(object_table/object_view,key);该函数用于基于对象视图或者对象表的行数据生成REF。
(3) REF(expr):该函数用于返回对象所对应的REF值。
(4) VALUE(expr):该函数用于返回对象所对应的对象实例数据。

二 建立对象类型
当建立对象类型时,需要分别建立对象类型规范和对象类型体,其中对象类型规范用于定义对象的公用的属性和方法(过程,函数),对象类型体用于实现对象类型规范所定义的公用方法,下面以建立对象类型为例,说明建立对象类型规范和对象类型体的方法。
1.建立对象类型规范语法如下:
1CREATE OR REPLACE TYPE type_name AS OBJECT{
2 attribute1 datatype[ , attribute2 datatype, ... ],
3 [ MEMBER | STATIC method1 spec, MEMBER | STATIC method2 spec, ...]
4};
属性及方法如下:

下面以建立对象类型规范employee_type为例,说明建立对象类型规范的具体方法:
1CREATE OR REPLACE TYPE employee_type AS OBJECT{
2 eno NUMBER(6),
3 name VARCHAR2(10),
4 salary NUMBER(6,2),
5 job VARCHAR2(10),
6 dno NUMBER(2),
7 MEMBER PROCEDURE change_job(new_job VARCHAR2),
8 MEMBER PROCEDURE change_salary(new_sal VARCHAR2),
9 MEMBER PROCEDURE change_dept(new_dno VARCHAR2),
10 MEMBER FUNCTION get_sal RETURN NUMBER,
11};
2.建立对象类型体
如果对象类型规范包含公用方法,那么为了使用该对象方法,必须建立对象类型体,语法如下:
1CREATE OR REPLACE TYPE BODY employee_type AS
2 MEMBER | STATIC method1 body;
3 MEMBER | STATIC method1 body;
4 ...
5 END;
下面以实现对象类型employee_type的公用过程函数为例说明具体的语法:
1CREATE OR REPLACE TYPE BODY employee_type AS
2 MEMBER PROCEDURE change_job(new_job VARCHAR2)
3 IS
4 BEGIN
5 job:=new_job;
6 END;
7 MEMBER PROCEDURE change_salary(new_sal NUMBER)
8 IS
9 BEGIN
10 salary:=new_sal;
11 END;
12 MEMBER PROCEDURE change_dept(new_dno VARCHAR2)
13 IS
14 BEGIN
15 dno:=new_dno;
16 END;
17 MEMBER FUNCTION get_sal RETURN NUMBER
18 IS
19 BEGIN
20 RETURN salary;
21 END;
22 END;
三 使用对象类型方法
对象类型方法用于描述对象所要执行的操作。当定义对象类型时,可以定义构造方法,MEMBER方法,STATIC方法,MAP方法以及ORDER方法。
(1) 构造方法:构造方法用于初始化对象并返回对象实例,构造方法的名称与对象类型的完全相同。当建立对象类型规范时,Oracle会自动为该对象类型生成默认构造方法,其默认参数是对象类型的所有属性。应用开发人员还可以自定义构造方法,自定义构造方法时,需要使用CONSTRUCTOR FUNCTION,并且构造方法名称必须与对象类型名称一致。
(2) MEMBER方法:MEMBER方法用于访问对象实例的数据,为了访问特定对象实例,需要使用MEMBER方法,而访问当前对象实例可以使用内置参数SELF。注意,MEMBER方法只能由对象实例调用,而不能由对象类型调用。
(3) STATIC方法:STATIC方法用于在对象类型上执行全局操作。注意,STATIC方法只能由对象类型调用,而不能由对象实例调用。
(4) MAP方法:MAP方法用于按照特定规则排序对象实例的数据,该种方法可以用于排序多个对象实例,注意,对象类型最多只能定义一个MAP方法。
(5) ORDER方法:ORDER方法也用于比较对象实例,但该方法只能比较两个对象实例的大小,而且,对象类型最多只能定义一个ORDER方法,ORDER方法不能MAP方法同时定义。
1.建立包含各种方法的对象方法
下面以建立对象类型employee_type,并定义属性和各种对象方法为例,说明建立包含各种方法的对象类型:

相关代码如下:
1CREATE OR REPLACE TYPE employee_type AS OBJECT(
2 eno NUMBER(6),
3 name VARCHAR2(10),
4 salary NUMBER(6,2),
5 job VARCHAR(10),
6 dno NUMBER(2),
7
8 CONSTRUCTOR FUNCTION employee_type (eno NUMBER,name VARCHAR2) RETURN SELF AS RESULT,
9 MEMBER PROCEDURE change_sal(new_sal NUMBER),
10 MEMBER FUNCTION get_sal RETURN NUMBER,
11 STATIC FUNCTION get_time RETURN VARCHAR2,
12 MAP MEMBER FUNCTION sal_sort RETURN NUMBER
13 );
14
15 CREATE OR REPLACE TYPE BODY employee_type
16 AS
17 CONSTRUCTOR FUNCTION employee_type (eno NUMBER, name VARCHAR2) RETURN SELF AS RESULT
18 IS
19 BEGIN
20 SELF.eno:=eno;
21 SELF.naem:=name;
22 RETURN;
23 END;
24 MEMBER PROCEDURE change_sal(new_sal NUMBER )
25 IS
26 BEGIN
27 salary:=new_sal;
28 END;
29 MEMBER FUNCTION get_sal RETURN NUMBER
30 IS
31 BEGIN
32 RETURN salary;
33 END;
34 STATIC FUNCTION get_time RETURN VARCHAR2
35 IS
36 BEGIN
37 RETURN TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS');
38 END;
39 MAP MEMBER FUNCTION sal_sort RETURN NUMBER
40 IS
41 BEGIN
42 RETURN salary;
43 END;
44 END;
2.使用各种对象方法
构造方法用于初始化对象实例,MEMBER方法用于访问对象实例数据,STATIC方法用于在对象类型上执行全局操作,MAP方法用于比较对象实例的数据。下面以在PL/SQL块中使用对象类型及各种方法为例,说明如何使用各种对象方法:
1DECLARE
2 TYPE emp_table_type IS TABLE OF employee_type
3 INDEX BY BINARY_INTEGER;
4 emp_table emp_table_type;
5 index_max INT;
6 index_min INT;
7 temp_max INT:=0;
8 temp_min INT:=9999999;
9 BEGIN
10 emp_table(1):=employee_type(1,'SCOTT');
11 emp_table(2):=employee_type(2,'SMITH');
12 emp_table(3):=employee_type(3,'BLAKE');
13 emp_table(1).change_sal(&sal1);
14 emp_table(2).change_sal(&sal2);
15 emp_table(3).change_sal(&sal3);
16 FOR i IN 1..emp_table.COUNT LOOP
17 DBMS_OUTPUT.PUT_LINE('姓名:'||emp_table(i).name||'工资:'||emp_table(i).get_sal);
18 IF emp_table(i).sal_sort>temp_max THEN
19 temp_max:=emp_table(i).sal_sort;
20 index_max:=i;
21 END IF;
22 IF emp_table(i).sal_sort<temp_min THEN
23 temp_min:=emp_table(i).sal_sort;
24 index_min:=i;
25 END IF;
26 END LOOP;
27 DBMS_OUTPUT.PUT_LINE('工资最高的雇员是:'||emp_table(index_max).name);
28 DBMS_OUTPUT.PUT_LINE('工资最低的雇员是:'||emp_table(index_min).name);
29 END;
四 使用对象表
当定义表列时,不仅可以使用Oracle内置的数据类型(NUMBER,VARCHAR2,CHAR, DATE, CLOB等),而且可以使用用户自定义的对象类型或者集合类型,对象表是指包含对象类型列的表。
1.在对象表上引用对象方法
当在对象表上使用SELECT和DML语句是,只能引用对象类型函数,而对象类型过程只能在PL/SQ L块中引用。下面通过在PL/SQL块中操作对象表person为例。
2.增加数据:下面以建立用于为对象表增加数据的过程add_person为例,说明为对象表增加数据并引用构造方法:
1CREATE OR REPLACE PROCEDURE add_person(
2 eno NUMBER,
3 name VARCHAR2,
4 salary NUMBER DEFAULT 1000,
5 job VARCHAR2 DEFAULT 'CLERK',
6 dno NUMBER DEFAULT 10,
7 sex VARCHAR2 DEFAULT 'FEMALE' ;
8 )
9 IS
10 BEGIN
11 INSERT INTO person VALUES(
12 employee_type(eno,name,salary,job,dno),sex);
13 END;
14 EXEC add_person(1113,'MARRY');
3.更新工资:下面以建立用于更新salary属性数据的过程update_salary为例,说明在PL/SQL块中如何更新对象属性数据并引用对象过程:
1CREATE OR REPLACE PROCEDURE update_salary(eno NUMBER, salary NUMBER)
2 IS
3 employee employee_table;
4 BEGIN
5 SELECT a.basic_info INTO employee FROM person a WHERE a.basic_info.eno=eno;
6 employee.change_sal(salary);
7 UPDATE person a SET basic_info=employee WHERE a.basic_info.eno=eno;
8 END;
9
10 EXEC update_salary(1113,3000);
4.查询数据:下面以建立用于取得对象表salary属性的函数get_sal为例,说明在PL/SQL块中如何检索对象属性数据并引用对象函数:
1CREATE OR REPLACE FUNCTION get_sal(eno NUMBER) RETURN NUMBER
2 IS
3 employee employee_table;
4 BEGIN
5 SELECT a.basic_info INTO employee FROM person a WHERE a.basic_info.eno=eno;
6 RETURN employee.get_sal;
7 END;
8VAR salary NUMBER
9EXEC : salary:=get_sal(1113)
10PRINT salary;
5.删除数据:下面以建立用于根据name属性删除对象表数据的过程delete_person为例,说明在PL/SQL块中如何根据对象属性删除对象表数据:
1CREATE OR REPLACE PROCEDURE delete_person (name VARCHAR2)
2 IS
3 BEGIN
4 DELETE FROM person a WHERE LOWER(a.basic_info.name)=LOWER(name);
5 END;
6
7 EXEC delete_person('MARRY');
扫描下方的二维码关注公众号,了解相关更新





