Oracle DB视图(二)
其重新授予以前授予过的对象权限。
从视图中检索数据
你可以从视图中检索数据,就像从任何表中检索数据一样。可以显示整个视图的内容,也可以只显示特定的行或列。
hr@TEST0924> select * from salvu50;
ID_NUMBER NAME ANN_SALARY
---------- ------------------------- ----------
198 OConnell 31200
199 Grant 31200
...
45 rows selected.
修改视图
可以使用CREATE OR REPLACE VIEW子句修改视图EMPVU80。为每个列名添加一个别名:
hr@TEST0924> CREATE OR REPLACE VIEW empvu80(id_number, name, sal, department_id)
2 AS SELECT employee_id, first_name || ' '|| last_name, salary, department_id FROM employees WHERE department_id = 80;
View created.
CREATE OR REPLACE VIEW子句中列出的列别名与子查询中的列具有相同的顺序。
使用OR REPLACE选项,可以创建一个视图,甚至可以创建一个与已存在的视图同名的视图,以便替换旧版本的视图。这意味着可以更改视图,而不必经过删除、重新创建对象和重新授予对象权限的过程。
注:在CREATE OR REPLACE VIEW子句中指定列别名时,请注意别名的列出顺序应与子查询中列的顺序相同。
创建复杂视图
创建包含组函数的复杂视图以显示两个表中的值:
hr@TEST0924> create or replace view dept_sum_vu(name,minsal,maxsal,avgsal)
2 as select d.department_name,min(e.salary),max(e.salary),avg(e.salary) from employees e join departments d
3 on (e.department_id=d.department_id) group by d.department_name
4 /
View created.
示例中创建了一个复杂视图,其中包含按部门列出的部门名称、最低薪金、最高薪金和平均薪金。请注意,已为该视图指定了替代名称。如果视图中有任何列来自于函数或表达式,则需要使用替代名称。
可以使用DESCRIBE 命令查看视图的结构。通过发出SELECT 语句可显示视图的内容。
hr@TEST0924> select * from dept_sum_vu;
NAME MINSAL MAXSAL AVGSAL
------------------------------ ---------- ---------- ----------
Administration 4400 4400 4400
Accounting 8300 12008 10154
...
11 rows selected.
对视图执行DML 操作的规则
可以对整个视图中的数据执行DML 操作,但这些操作必须符合特定的规则,通常可以对简单视图执行DML 操作。
如果视图不包含以下任何内容,则可以从视图中删除行:
- 组函数
- GROUP BY 子句
- DISTINCT 关键字
- 伪列ROWNUM 关键字
对视图执行DML 操作的规则修改数据
如果视图包含以下内容,则不能修改视图中的数据:
组函数
GROUP BY 子句
DISTINCT 关键字
伪列ROWNUM 关键字
由表达式定义的列
可以修改视图中的数据,除非该视图包含上规则中提到的任何条件或由表达式定义的列(例如,SALARY * 12 )。
对视图执行DML 操作的规则插入数据
如果视图包括以下内容,则不能向视图添加数据:
组函数
GROUP BY 子句
DISTINCT 关键字
伪列ROWNUM 关键字
由表达式定义的列
基表中未被视图选中的NOT NULL 列
可以向视图添加数据,除非视图包含此上列中列出的任何项。如果视图包含的NOT NULL列在基表中没有指定默认值,则不能向视图添加数据。在视图中必须显示所有需要
的值。请记住,您要通过视图将值直接添加到基表中。
使用WITH CHECK OPTION子句
使用WITH CHECK OPTION子句可确保对视图执行的DML 操作只在视图范围内起作用:
hr@TEST0924> create or replace view empvu20
2 as select * from employees where department_id=20
3 with check option constraint empvu20_ck
4 /
View created.
如果尝试使用INSERT语句插入department_id不为20 的一行,或者使用UPDATE语句更新视图中任何行的部门编号,则操作会失败,因为这违反WITH CHECK OPTION约束条件。
可以在视图中执行引用完整性检查。还可以在
数据库级别强制实现约束条件。视图可以用来保护数据完整性,但此用途很有限。
WITH CHECK OPTION子句指定通过视图执行的INSERT和UPDATE不能创建该视图无法选择的行。因此,能够对要插入或更新的数据强制执行完整性约束条件和数据验证检查。如果尝试对视图未选中的行执行DML 操作,则会显示一条错误,还会显示约束条件名称(如果已指定)。
hr@TEST0924> update empvu20 set department_id=10 where employee_id=201;
update empvu20 set department_id=10 where employee_id=201
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
注:如果部门编号已更改为10,则该视图将无法看到此雇员,因此不会更新任何行。
所以,使用WITH CHECK OPTION子句时,该视图只能看到部门20 中的雇员,并且不允许通过该视图更改这些雇员的部门编号。
拒绝DML 操作
通过在视图定义中添加WITH READ ONLY选项可以确保不会执行DML 操作。
尝试对视图中的任何行执行DML 操作都会导致产生
Oracle Server 错误。
hr