1, 简单视图:使用单表查询创建的视图
可以对视图进行增删改操作,除了一些限定外,如:创建只读视图,或带有with chek option 选项的视图,或视图中不包含
基表中不允许为空的列(不允许向视图中插入数据)等
1)使用with check option 可以限定对单表视图的修改, 不能更新无法通过该视图查看的行
create or replace view emp_view as select * from emp where job='SALESMAN' with check option constraint empv;
SQL> select * from emp_view;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
update emp_view set job='CLERK' where empno=7499;将无法更新
如创建视图时没有with check option, 修改视图后将在视图查不到该行数据
2) 使用with read only 创建只读视图
create or replace view emp_view as select * from emp where job='SALESMAN' with read only;
3) 创建视图时使用force,强制创建视图
如果视图定义中引用了不存在的表或表中有不存在的列,或创建视图的所有者没有访问表的权限,都可以创建,
但创建的视图有错误,在稍后创建表或得到访问权限后,ORACLE自动重新编译使视图有效,可以手动编译
假设dept表也不存在a1列,但还可以创建视图,但会提示错误,在表dept添加列a1后,视图自动编译为有效
create or replace force view emp_view as select a1,dname from dept;
可以 使用 alter view emp_view compile ; 手动编译
2, 复杂视图 :
1)使用多表联接创建视图,
2)创建视图时包括函数或group by 等
复杂视图通常不能直接进行增删改,但对于使用多表联接创建的视图,可以使用INSTEAD OF 触发器可以修改(后面课程)
create or replace view emp_dept_view as select empno,ename,dname,emp.deptno
from dept,emp where dept.deptno=emp.deptno;
3, 键保留表
键保留表:复杂视图中出现的表。
如果满足条件:1) 主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的.
如: create or replace view emp_dept_view as
select empno,ename,dname,dept.deptno
from dept,emp where dept.deptno=emp.deptno;
empno:是emp表的主键,并且它的值在emp_dept_view 中是唯一且非空.所以emp表是键保留表
而deptno的值在视图中不唯一,所以dept不是键保留表
可以 修改视图中键保留表中的数据,主键值除外
update emp_dept_view set ename='JOE' where empno=7566; //可以
update emp_dept_view set dname='abc' where deptno=30; //不行 dname是dept表中的列,dept不是键保留表
4,分区视图
create or replace view v_emp as select * from emp1 partition(p1) union all select * from emp1 partition(p2);
数据字典: user_views
使用方法:在SQL*PLUS下
col view_name for a10 --定制显示的列宽
col text for for a50
set linesize 200 --设置每行显示的字符数
select view_name,text from user_views; --查看用户创建的视图情况