自定义对象 创建对象: CREATE [OR REPLACE] TYPE <对象名> AS OBJECT( 属性1 类型 属性2 类型 . . 方法1的规范(MEMBER PROCEDURE <过程名> 方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型) . . PRAGMA RESTRIC_REFERENCES(<方法名>,WNDS/RNDS/WNPS/RNPS); 关键字"PRAGMA RESTRIC_REFERENCES"通知ORACLE函数按以下模式之一操作; WNDS-不能写入数据库状态; RNDS-不能读出数据库状态; WNPS-不能写入包状态; RNDS-不能读出包状态; 创建对象主体: CREATE [OR REPLACE] TYPE body <对象名> AS 方法1的规范(MEMBER PROCEDURE <过程名> is <PL/SQL块> 方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型 is <PL/SQL块> END; 使用MAP方法和ORDER方法 用于对自定义类型排序。每个类型只有一个MAP或ORDER方法。 格式:MAP MEMBER FUNCTION <函数名> RETURN 类型 ORDER MEMBER FUNCTION <函数名> RETURN NUMBER 创建对象表 CREATE TABLE <表名> OF <对象类型> 示例: 1. 创建name 类型 create or replace type name_type as object( f_name varchar2(20), l_name varchar2(20), map member function name_map return varchar2); create or replace type body name_type as map member function name_map return varchar2 is --对f_name和l_name排序 begin return f_name||l_name; end; end; 2 创建address 类型 create or replace type address_type as object ( city varchar2(20), street varchar2(20), zip number, order member function address_order(other address_type) return number); create or replace type body address_type as order member function address_order(other address_type) return number is --对zip排序 begin return self.zip-other.zip; end; end; 3 创建stu对象 create or replace type stu_type as object ( stu_id number(5), stu_name name_type, stu_addr address_type, age number(3), birth date, map member function stu_map return number, member procedure update_age); create or replace type body stu_type as map member function stu_map return number is --对stu_id排序 begin return stu_id; end; member procedure update_age is --求年龄用现在时间-birth begin update student set age=to_char(sysdate,'yyyy')-to_char(birth,'yyyy') where stu_id=self.stu_id; end; end; 4. 创建对象表 create table student of stu_type(primary key(stu_id)); 5.向对象表插值 insert into student values(1,name_type('关','羽'),address_type('武汉','成都路',43000), null,sysdate-365*20); 6.使用对象的方法 delcare aa stu_type; begin select value(s) into aa from student s where stu_id=1; --value()将对象表的每一行转成行对象括号中必须为表的别名 aa.update_age(); end; 7.select stu_id,s.stu_name.f_name,s.stu_name.l_name from student s; --查看类型的值 8.select ref(s) from student s ; --ref()求出行对象的OID,括号中必须为表的别名;deref()将oid变成行队像; |