Oracle数据库---------------视图的定义与使用

关于Oracle数据库的学习记录:

四十六、视图的定义与使用
视图是一个非常重要的团队开发工具对象
在所有学习过的SQL语句之中,查询是一件非常麻烦的事情,并且发现一般查询语句的代码实在是太长了,那么而这些代码如果写在程序里面会不方便进行程序的维护,那么在标准开发环境下,往往会由数据库的设计人员根据业务也要进行视图的定义以简化查询操作的代码编写,所以所谓的视图就是包装了复杂查询的SQL语句对象,如果要想创建视图,可以使用如下语法完成:
CREATE [OR REPLACE] VIEW 视图名称 AS 子查询;

范例:创建视图
CREATE VIEW myview AS
SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg
FROM dept d,(
SELECT deptno dno,COUNT(empno) count,AVG(sal) avg
FROM emp
GROUP BY deptno) temp
WHERE d.deptno=temp.dno(+);
以上如果在scott/tiger普通用户下进行,会缺少权限
在最早的的Oracle开发里面,以上的功能肯定是可以直接执行,从Oracle 10G R2版本开始,默认情况下SCOTT这个用户不具备创建视图的权限了
范例:为SCOTT用户授予创建视图的权限
CONN sys/change_on_install AS SYSDBA;
GRANT CREATE VIEW TO scott;
CONN scott/tiger;
再执行:
CREATE VIEW myview AS
SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg
FROM dept d,(
SELECT deptno dno,COUNT(empno) count,AVG(sal) avg
FROM emp
GROUP BY deptno) temp
WHERE d.deptno=temp.dno(+);
当视图在创建完成之后就会自动的在“user_views”数据字典里面保存相应的对象信息,随后只需要查询视图就可以实现复杂查询的操作了
SELECT * FROM myview;
那么以上的视图里面包含有数据,于是下面尝试修改数据
范例:修改数据
UPDATE myview SET count=60 WHERE deptno=30;
以上修改出现错误:ORA-01779:无法修改与非键值保存表对应的列
UPDATE myview SET dname=’测试’ WHERE deptno=30;
也不能修改
严格来讲,以上的视图的确是不能修改的,因为视图保存的数据不是真实数据而只是查询出来的数据,并且在以上的复杂查询里面这样的操作更是不可能修改
但是如果说现在的视图中的数据组成比较简单,假设只有一张数据表,那么就可以修改了
范例:替换视图
CREATE OR REPLACE VIEW myview
AS
SELECT * FROM emp WHERE deptno=20;
如果此时myview视图不存则创建一个新的视图,如果存在则使用新的查询语句替换掉已有的查询语句,创建了一张包含有20部门雇员信息的视图(组成关键:deptno=20)
SELECT * FROM myview;
范例:更新视图的创建条件
UPDATE myview SET deptno=40 WHERE empno=7369;
此时更新可以正常完成,但是发现视图的更新最终影响到了emp表的更新操作,严格来讲这样做并不好,因为更新的是视图的创建条件。所以为了保护视图的创建条件不被更新,那么可以使用WITH CHECK OPTION子句控制
执行rollback;
CREATE OR REPLACE VIEW myview
AS
SELECT * FROM emp WHERE deptno=20
WITH CHECK OPTION;
再执行
UPDATE myview SET deptno=40 WHERE empno=7369;
如果此时再次更新视图的创建条件,那么就会出现“ORA-01402:视图 WITH CHECK OPTION where 子句违规”的错误信息,如果现在更新的不是创建条件,而是其他的字段,能否更新?
范例:更新视图的非创建条件
UPDATE myview SET sal=99999 WHERE empno=7369;
以上的代码发现可以正常执行了更新,那么很明显,这样也不合理,因为视图里面的数据都不是真实数据,只是查询结果,所以最好的做法是让视图不能够做更新,使用WITH READ ONLY子句定义
范例:定义只读视图
先rollback;

CREATE OR REPLACE VIEW myview
AS
SELECT * FROM emp WHERE deptno=20
WITH READ ONLY;
再次执行
UPDATE myview SET sal=99999 WHERE empno=7369;
出现错误:“ORA-42399:无法对只读视图执行DML操作”
在以后创建视图的时候尽可能都设置为只读视图

范例:删除视图
DROP VIEW myview;
只要是数据库对象基本的操作流程都是类似的

总结:
1.如果是标准的开发强烈建议使用驶入,这样可以很好的实现分工
2.如果项目里面真使用到了视图的话,有可能视图的数量会远远大于表的数量
3.定义的视图都建议使用只读视图,因为视图中的数据都不是真实的数据

猜你喜欢

转载自blog.csdn.net/qq_40112624/article/details/81904355