MAP方法
MAP方法用于将对象实例映射为标量数值(NUMBER,DATE,VARCHAR2等);对于相同对象类型不同对象实例来说,因为他们的数据类型是复合数据类型,所以对象实例之间不能直接进行比较。为了排序多个对象实例的数据,可以在建立对象类型时定义MAP方法。
*注意:
一个对象类型最多只能定义一个MAP方法,并且MAP方法和ORDER方法不能同时使用。
1、建立对象类型规范和对象类型体test_map_method_obtype
/**
建立对象类型规范和对象类型体test_map_method_obtype
MAP方法主要用于获取雇员的年龄
**/
--建立对象类型规范test_map_method_obtype
CREATE OR REPLACE TYPE test_map_method_obtype AS OBJECT(
name VARCHAR2(30),
gender VARCHAR2(2),
birthdate DATE,
MAP MEMBERFUNCTION get_age_fnc RETURN NUMBER
);
/
--建立对象类型体test_map_method_obtype
CREATE OR REPLACE TYPE BODY test_map_method_obtype AS
MAP MEMBERFUNCTION get_age_fnc RETURN NUMBER IS
BEGIN
RETURN TRUNC((SYSDATE-birthdate)/365);
END get_age_fnc;
END;
/
2、建立对象表test_map_method并追加数据
/**
基于对象类型test_map_method_obtype
建立对象表test_map_method并为其插入数据
**/
--建立对象表test_map_method
DROP TABLE test_map_method PURGE;
CREATE TABLE test_map_method(
empno NUMBER(2) ,
employee test_map_method_obtype NOT NULL,
job VARCHAR2(20) NOT NULL,
sal NUMBER(7,2)
);
--向对象表test_map_method插入数据
INSERT INTO test_map_method
VALUES(10,test_map_method_obtype('张三', '男',
TO_DATE('1990-02-10', 'yyyy-mm-dd')),'CLERK',2000);
INSERT INTO test_map_method
VALUES(20,test_map_method_obtype('李四', '男',
TO_DATE('1989-08-01', 'yyyy-mm-dd')),'SALESMAN',3000);
INSERT INTO test_map_method
VALUES(30,test_map_method_obtype('王丽', '女',
TO_DATE('1988-06-09', 'yyyy-mm-dd')),'MANAGER',6000);
COMMIT;
3、调用MAP方法进行雇员年龄的比较;
DECLARE
--定义嵌套表test_tbtype
TYPE test_tbtype IS TABLE OF test_map_method_obtype;
--声明嵌套表类型变量t_person
t_person test_tbtype;
BEGIN
--批处理数据,将对象表中的对象列employee
--的数据存储在嵌套表t_person中
SELECT employee
BULK COLLECT INTO t_person
FROM test_map_method;
--比较年龄大小
IF t_person(1).get_age_fnc() >t_person(2).get_age_fnc() THEN
DBMS_OUTPUT.put_line(t_person(1).name||'比'||t_person(2).name||'大');
ELSE
DBMS_OUTPUT.put_line(t_person(1).name||'比'||t_person(2).name||'小');
END IF;
END;
/