PL/SQL程序设计 过程, 函数 Trigger 对象关系数据库技术
对象关系数据库技术 支持复杂数据的存储,和处理 实现了对象属性和方法的封装
数据库对象的定义和使用例 定义对象类型 CREATE TYPE name_type AS OBJECT ( first_name VARCHAR2(4), last_name VARCHAR2(4) ) ; CREATE TYPE address_type AS OBJECT ( city VARCHAR2(10), street VARCHAR2(10), zip NUMBER(6) ) ; CREATE TABLE worker ( wid NUMBER(5) PRIMARY KEY, name name_type , address address_type ) ; 作为关系表的列数据类型使用
对象数据类型数据的插入 使用对象类型的构造方法插入包括对象类型(新数据类型)的一个值(对象)。 构造方法是系统为每一个对象类型自动创建的特殊方法,利用此方法为该类型创建对象。 构造方法的名称与对象类型(类)同名。
插入语句示笵: insert into worker values(1,name_type(‘王’,‘明明'), address_type('北京','白颐路5号',100084)); values(2,name_type(‘张’,‘大虎'), address_type('天津','康宁里20号',300072)); values(3,name_type('赵','力平'), address_type('上海','南京路23号',200092));
查询语句示范: select * from worker ; WID NAME(FIRST_NAME, LAST_NAME) ADDRESS(CITY, STREET, ZIP) ----- ------------------------------ ------------------------------ 1 NAME_TYPE(‘王’, ‘至远’) ADDRESS_TYPE('北京', '白颐路5号', 100084) 2 NAME_TYPE(‘张’, ‘大年’) ADDRESS_TYPE(‘天津’, ‘康宁里20号’, 300072) 3 NAME_TYPE(‘赵’, ‘力平’) ADDRESS_TYPE(‘上海’, ‘南京路23号’, 200092) select wid,name from worker; WID NAME(FIRST_NAME, LAST_NAME) --------- ------------------------------------------------- 1 NAME_TYPE(‘王’, ‘至远’) 2 NAME_TYPE(‘张’, ‘大年’) 3 NAME_TYPE(‘赵’, ‘力平’)
建立对象类型(对象类型声明) 属性和方法的封装实例 create type 类型名 as object( 属性名1 类型说明, 建立对象类型(对象类型声明) create type 类型名 as object( 属性名1 类型说明, 属性名2 类型说明, … ... member function 函数名 (参数说明) return 返回类型, member procedure 过程名(参数说明), … ) ;
定义类成员方法 创建类成员方法 create type body 类型名( member function 函数方法名 (参数说明) return 返回类型 is 说明部分 begin 执行部分 end ; member procedure 过程方法名(参数说明) );
建立对象表封装属性和方法实例
定义对象数据类型 CREATE or replace TYPE employee_type AS OBJECT ( empno number(5), ename varchar2(10), hiredate date, MEMBER FUNCTION days_at_company RETURN number, PRAGMA RESTRICT_REFERENCES (days_at_company,wnds,wnps) ); /
可以使用PRAGMA选项通知PL/SQL编译器禁止其他方法对数据库表列和包中的变量读写, 当方法体中出现违反情况时, 编译出错。 格式: PRAGMA RESTRICT_REFERENCES ( function_name, WNDS [, WNPS] [, RNDS] [, RNPS] ); WNDS (write no database state) 不允许写数据库 RNDS(read no database state) 不允许读数据库 WNPS(write no package state) 不允许改程序包变量 RNPS(read no package state )不允许引用程序包变量
2.定义对象类型的成员方法 CREATE or replace TYPE BODY employee_type AS MEMBER FUNCTION days_at_company RETURN NUMBER IS BEGIN RETURN floor(sysdate - hiredate); END; /
CREATE TABLE employees OF employee_type ; 3. 建立对象表 CREATE TABLE employees OF employee_type ; 4. 插入数据 INSERT INTO employees VALUES(1,‘Jone’,‘10-10月-1989’); VALUES(2,‘smith’,‘10-10月-1997’); VALUES(3,'king','1-1月-2000');
5. 获取对象表数据 select * from employees; 输出结果: EMPNO ENAME HIREDATE ------ -------------------- ---------- 1 Jone 10-10月-89 2 smith 10-10月-97 3 king 01-1月 -00
通过别名存取对象方法 Select e.days_at_company() from employees e where e.empno=3; 输出结果: E.DAYS_AT_COMPANY() ------------------- 296
select e.empno,e.ename,e.hiredate,e.days_at_company() 通过别名存取对象的属性和方法 select e.empno,e.ename,e.hiredate,e.days_at_company() from employees e; --输出结果: EMPNO ENAME HIREDATE E.DAYS_AT_COMPANY() ------ -------------------- ---------- ------------------- 1 Jone 10-10月-89 4031 2 smith 10-10月-97 1109 3 king 01-1月 -00 296
对象关系技术小结 定义一个含方法的数据类型 命名成员体 创建table对象 插入数据时, 复杂数据类型要调用系统自动创建的类型构造方法,它与数据类型同名 检索数据 例: select * from emp_o; 注意用别名存取对象的属性和方法 select e.empno, e.ename.ename, ename.days_at_company() from emp_o e;