原著作者:jim czuprynski
使用联接视图实现复杂的需求
使用一个联接的视图把前面的例子带到更高的层次:允许我们的应用访问多个表的信息。扩展前面的例子:
drop view hr.bv_employees;
create or replace view hr.bv_employees (
empid,
fname,
lname,
email,
hire_date,
job_id,
jobtitle,
deptname)
as
select
e.employee_id,
e.first_name,
e.last_name,
e.email,
e.hire_date,
e.job_id,
j.job_title,
d.department_name
from
hr.employees e,
hr.jobs j,
hr.departments d
where e.job_id = j.job_id
and e.department_id = d.department_id
/
drop public synonym employees;
create public synonym employees for bv_employees;
grant select, insert, update, delete on hr.bv_employees to oltprole;
记住,当你创建了一个复杂的视图后,oracle禁止发出的每句sql语句中针对基本表的dml操作,哪怕仅针对一个。另外,insert语句可以应用在视图中的主键保持表(key preserved table)。主键保持表就是它的主键或唯一健在视图返回的结果集中也是唯一的。在本例中,就是employees表。all_updatable_columns数据字典显示了哪些是可以被更新的。
sql> select
2 column_name,
3 updatable,
4 insertable,
5 deletable
6 from all_updatable_columns
7 where owner = 'hr' and table_name = 'bv_employees';
column_name upd ins del
------------------------------ --- --- ---
empid yes yes yes
fname yes yes yes
lname yes yes yes
email yes yes yes
hire_date yes yes yes
job_id yes yes yes
jobtitle no no no
deptname no no no
使用程序包实现功能的包装化和数据存取的标准化
oracle程序包的最非凡的功能就是它们的把对数据存取的功能包装成一个数据库对象的能力。我们现在的开发组就是使用程序包的公共属性和方法(包括传统的set 和get这种面向对象的方法)来描述应用程序针对基本视图集的数据库接口需求。
而且,既然程序包的规格定义描述了程序包体的函数和过程的公共接口,那么它就有比传统的存储函数和过程的好处:程序包体可以和程序包分开单独编译。那就意味着,除非签名(函数和存储过程的传入或传出参数和返回参数)发生了变化,否则程序包规格定义是不需要重新编译的。这可以最大限度地降低由于依赖对象而发生的重编译。