PL/SQL中对象的组成结构
PL/SQL中的对象类型是一种自定义的复合类型,与包的定义很相似,由两部分组成:
- 对象类型规范:是对象与应用的接口,用于定义对象的公用属性和方法。
- 对象类型体:用于实现对象类型规范所定义的公用方法。
在对象类型规范中定义对象属性时,必须要提供属性名和数据类型,对象类型属性可以使用多数Oracle数据类型,但是不能使用以下类型:
- LONG和LONG RAW
- ROWID和UROWID
- PL/SQL特定的类型,如BINARY_INTEGER、BOOLEAN、%TYPE、%ROWTYPE、REF CURSUR、RECORD等。
在定义对象类型的属性时,不能指定对象属性的默认值,也不能指定NOT NULL选项。
对象类型的方法有以下几种:
- 构造方法:该方法类似于Java语言中的构造函数,用来初始化一个对象类型并返回对象的实例。
- MEMBER方法:该方法允许对象的实例进行调用,在MENBER方法中可以访问对象实例的数据,通常称为实例方法或成员方法。
- STATIC方法:该方法可以直接在对象类型上进行调用,它用于在对象类型上执行全局操作,通常称为静态方法。
- MAP方法:用于在多个对象间排序的映射方法。
- ORDER方法:用于在两个对象实例间排序的排序方法。
定义对象类型
定义对象类型的语法比较复杂,选项比较多,所以我们直接来看代码来了解怎么定义一个对象。
首先来定义一个对象类型规范:
--定义对象类型规范employee_obj
CREATE OR REPLACE TYPE employee_obj AS OBJECT (
--定义对象类型属性
empno NUMBER(4),
ename VARCHAR2(20),
job VARCHAR2(20),
sal NUMBER(10,2),
comm NUMBER(10,2),
deptno NUMBER(4),
--定义对象类型方法
MEMBER PROCEDURE Change_sal(p_empno NUMBER,p_sal NUMBER),
MEMBER PROCEDURE Change_comm(p_empno NUMBER,p_comm NUMBER),
MEMBER PROCEDURE Change_deptno(p_empno NUMBER,p_deptno NUMBER),
MEMBER FUNCTION get_sal(p_empno NUMBER) RETURN NUMBER,
MEMBER FUNCTION get_comm(p_empno NUMBER) RETURN NUMBER,
MEMBER FUNCTION get_deptno(p_empno NUMBER) RETURN INTEGER
) NOT FINAL; --指定该类可以被继承,如果指定FINAL,表示该类无法被继承
然后来定义对象体:
--定义对象类型体
CREATE OR REPLACE TYPE BODY employee_obj
AS
MEMBER PROCEDURE change_sal (p_empno NUMBER, p_sal NUMBER)
IS --定义对象成员方法,更改员工薪资
BEGIN
UPDATE emp
SET sal = p_sal
WHERE empno = p_empno;
END;
MEMBER PROCEDURE change_comm (p_empno NUMBER, p_comm NUMBER)
IS --定义对象成员方法,更改员工提成
BEGIN
UPDATE emp
SET comm = p_comm
WHERE empno = p_empno;
END;
MEMBER PROCEDURE change_deptno (p_empno NUMBER, p_deptno NUMBER)
IS --定义对象成员方法,更改员工部门
BEGIN
UPDATE emp
SET deptno = p_deptno
WHERE empno = p_empno;
END;
MEMBER FUNCTION get_sal (p_empno NUMBER)
RETURN NUMBER
IS --定义对象成员方法,获取员工薪资
v_sal NUMBER (10, 2);
BEGIN
SELECT sal
INTO v_sal
FROM emp
WHERE empno = p_empno;
RETURN v_sal;
END;
MEMBER FUNCTION get_comm (p_empno NUMBER)
RETURN NUMBER
IS --定义对象成员方法,获取员工提成
v_comm NUMBER (10, 2);
BEGIN
SELECT comm
INTO v_comm
FROM emp
WHERE empno = p_empno;
RETURN v_comm;
END;
MEMBER FUNCTION get_deptno (p_empno NUMBER)
RETURN INTEGER