Oracle中的概念:同义词、序列与视图
来源:优易学  2011-6-10 18:42:36   【优易学:中国教育考试门户网】   资料下载   IT书店

 视图中增加约束:
  create view yearly_hire_totals as
  select to_char(hire_date,’YYYY’) year,
  count(*) total
  from hr.employees
  group by to_char(hire_date,’YYYY’)
  order by to_char(hire_date,’YYYY’);
  联接视图:
  desc hr.emp_details_view
  set long 5000
  select text from dba_views where view_name=upper(‘emp_details_view’)
  with read only
  验证视图有效性:
  基本表的一些改变可能会导致视图无效:
  1) 改变出现在视图中列的名称,或删掉列
  2) 删除构建视图的基本表或视图
  [试验]使视图无效,并重新编译并使其有效:
  1) 基本表:create table base(id number,data varchar2(200));
  insert into base values(1,’abc’); commit;
  2) view: create view view_b as
  select id view_id, data view_data from t;
  select * from view_b;
  3) 更新基本表: alter table base modify(id number,data varchar2(255));
  alter table base add(data2 varchar2(100));
  4) 视图无效:select object_name, status from dba_objects where object_name=upper(‘view_b’)
  5) 使视图有效:只需要从视图中选取即可, oracle会自动对视图编译
  select * from view_b;
  6) 手动编译: alter view view_b compile;
  FORCE 选项:
  强制ORACLE接受无效的视图定义:
  1) 比如开发过程中A负责建立基本表,B负责建立视图。这样B不必依赖于A的工作进度就可以将视图建立并编译进数据库。
  2) 或者B需要建立在A用户表上视图,但是还暂时没有对A用户表select 的权限,可以先建立,等待授权后再使用。
  Create view invalid_view as
  Select * from table_not_exist;
  Create force view invalid_view as
  Select * from table_not_exist;
  通过视图进行更新和删除:
  类似于company_phone_book是可以跟新的。
  可以通过dba_updatable_columns查看那些列可以做那些更新;
  desc hr.company_phone_book
  select * from dba_updatable_columns where table_name=upper(‘company_phone_book’)
  尝试更新email和name
  update hr.company_phone_book
  set name=’Chen, Donny’
  where emp_id=100
  1. 使用instead of 触发器更新视图:
  create trigger update_name_company_phone_book
  INSTEAD OF
  Update on hr.company_phone_book
  Begin
  Update hr.employees
  Set employee_id=:new.emp_id,
  First_name=substr(:new.name, instr(:new.name,’,’)+2),
  last_name= substr(:new.name,1,instr(:new.name,’,’)-1),
  phone_number=:new.phone_number,
  email=:new.email
  where employee_id=:old.emp_id;
  end;
  2. With check option 约束:
  作用:阻止更新不能通过视图访问的数据。
  试验:
  1) 建立视图,只能看到department_id=10的雇员
  create view department_10 as
  select * from hr.employees where department_id=10
  With check option
  2) 选择:select employee_id,first_name,last_name from department_10;
  3) 查看可更新列:
  select * from dba_updatable_columns
  where table_name=upper(‘department_10’)
  4) 尝试将此人移动到部门20
  update department_10
  set department_id=20
  where employee_id=200
  报错!!
  这个视图限制我们只能访问department=10的数据,我们要通过视图修改department=20的数据,被禁止。
  [试验]关于前5名
  1) 谁是公司前5名的雇员
  select last_name,hire_date
  from hr.employees
  order by hire_date;
  2) 只想取回前五名数据呢?
  select last_name,hire_date
  from hr.employees
  where rownum<6
  order by hire_date;
  结果不正确,先取了前5条数据,再排序
  3)select last_name,hire_date
  from (select last_name,hire_date
  from hr.employees
  order by hire_date)
  where rownum<6

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训