暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 对象

数据库DBA 2021-04-13
1124

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


一 对象类型简介



对象类型是用户自定义的复合数据类型,它包括属性和方法两个部分组成,其中属性用于描述对象所具有的特征,方法用于实现对象操作。数据库对象类型和JavaC++等高级编程语言中的对象类似。但各种语言之间有一定的区别。


1.对象类型属性

当定义对象类型属性时,需要提供属性名和属性数据,但不能指定属性默认值和NOT NULL选项。注意,属性不能使用以下数据类型:

(1)    LONGLONG RAW.

(2)    ROWIDUROWID.

(3)    BOOLEAN, %TYPE, %ROWTYPE.


2.对象类型方法

对象类型方法用于描述对象所要执行的操作。当定义对象类型时,既可以定义方法,也可以不定义方法。在定义对象类型时,可以定义构造方法,MEMBER方法,STATIC方法,MAP方法以及ORDER方法。


3.对象实例

对象实例(Object Instance)是对象类型在现实世界中的具体表现形式。例如,雇员SCOTTSMITH是对象类型employee_type的两个对象实例。


4.对象函数

对象函数用于操作REF对象。REF实际是指向对象实例的指针,也称为参考对象,下面介绍这些对象函数的作用:

(1)    DEREF(expr):该函数用于返回参照对象所引用的对象实例。

(2)    MAKE_REF(object_table/object_viewkey);该函数用于基于对象视图或者对象表的行数据生成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 NUMBERname 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内置的数据类型(NUMBERVARCHAR2CHAR DATE CLOB等),而且可以使用用户自定义的对象类型或者集合类型,对象表是指包含对象类型列的表。

 

1.在对象表上引用对象方法

当在对象表上使用SELECTDML语句是,只能引用对象类型函数,而对象类型过程只能在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 NUMBERRETURN 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');


扫描下方的二维码关注公众号,了解相关更新


最后修改时间:2021-04-14 09:10:03
文章转载自数据库DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论