原著作者: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這種面向對象的方法)來描述應用程序針對基本視圖集的數據庫接口需求。
而且,既然程序包的規格定義描述了程序包體的函數和過程的公共接口,那么它就有比傳統的存儲函數和過程的好處:程序包體可以和程序包分開單獨編譯。那就意味著,除非簽名(函數和存儲過程的傳入或傳出參數和返回參數)發生了變化,否則程序包規格定義是不需要重新編譯的。這可以最大限度地降低由于依賴對象而發生的重編譯。