让你的应用程序不再对数据库的改动“感冒”(二)

原著作者: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这种面向对象的方法)来描述应用程序针对基本视图集的数据库接口需求。

而且,既然程序包的规格定义描述了程序包体的函数和过程的公共接口,那么它就有比传统的存储函数和过程的好处:程序包体可以和程序包分开单独编译。那就意味着,除非签名(函数和存储过程的传入或传出参数和返回参数)发生了变化,否则程序包规格定义是不需要重新编译的。这可以最大限度地降低由于依赖对象而发生的重编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值