Oracle PL/SQL开发基础(第五弹:视图)

视图是表的另外一种表示形式,他通过使用SELECT语句定义一个显示数据的虚表,这个虚表只有对视图的定义,并不包含实际的数据。

视图简介

可以将视图看成是一个“虚表”,或是一个“存储的查询”。在创建时视图时,只是将视图的定义信息保存到数据字典中,并不将实际的数据复制到任何地方。
如:

CREATE OR REPLACE VIEW view_dept_emp
AS
   SELECT emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, dept.dname,
          dept.loc
     FROM emp, dept
    WHERE emp.deptno = dept.deptno;

查询视图就像查询普通的表一样,如:

SELECT * FROM view_dept_emp;  

视图有如下优点:
- 视图限制数据的访问,因为视图能够选择性地显示表中的列。
- 视图可以用来构成简单的查询以取回复杂查询的结果。例如,视图能用于从多表中查询信息,而用户不必知道怎么写连接语句。
- 视图对特别的用户和应用程序提供数据独立性,一个视图可以从几个表中取回数据。
- 视图提供用户组,按照他们的特殊标准访问数据。

创建视图

视图按照是否涉及DML操作,可以分为两类:
- 简单视图:视图的数据仅来自一个表,在视图的SELECT语句中不包含函数或数据分组,总是可以通过视图来执行DML操作。
- 复杂视图:视图的数据来自多个表,可以包含函数或数据分组,并不总是可以通过视图进行DML操作。

简单视图

如:

CREATE OR REPLACE VIEW v_deptemp
AS
   SELECT empno, ename, job, mgr, hiredate, sal, comm
     FROM emp
    WHERE deptno = 20;

可以像使用表一样来使用这个视图,如:

SELECT * FROM v_deptemp;
INSERT INTO v_deptemp VALUES(7999,'李思','经理'7369,SYSDATE,8000,NULL);

可以使用WITH CHECK OPTION选项限制操作的数据必须是SELECT查询所能选择出来的数据,如:

CREATE OR REPLACE VIEW v_deptemp_check
AS
   SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
     FROM emp
    WHERE deptno = 20
          WITH CHECK OPTION CONSTRAINT v_empdept_chk;

当执行SML语句时,如果操作的数据不在SELECT查询所能选择的数据范围内,那么将触发ORA-01402异常。

如果要禁止在视图上执行DML操作,可以使用WITH READ ONLY选项,如:

CREATE OR REPLACE VIEW v_deptemp_readonly
AS
   SELECT empno, ename, job, mgr, hiredate, sal, comm
     FROM emp
    WHERE deptno = 20
   WITH READ ONLY;

如果在该视图上进行DML操作,将会触发ORA-42399异常。

可以通过给视图指定别名来提供更加友好的视图名称,如:

CREATE OR REPLACE VIEW v_deptemp_alias (员工编号,
                                        员工名称,
                                        职位,
                                        经理,
                                        雇佣日期,
                                        薪水,
                                        备注
                                       )
AS
   SELECT empno, ename, job, mgr, hiredate, sal, comm
     FROM emp
    WHERE deptno = 20;

被列出的列名的个数必须与在子查询中被选择的表达式相匹配。

复杂视图

如:

CREATE OR REPLACE VIEW v_sumdept(部门名称,部门编号)
AS
SELECT   dept.dname, SUM (emp.sal) sumsal
    FROM emp, dept
   WHERE emp.deptno = dept.deptno(+)
GROUP BY dept.dname;

修改视图

使用CREATE OR REPLACE即可删除原来的视图,然后创建一个新的视图取代原有的视图,同时会保留在该视图上授予的各种权限。

更改视图后,依赖于该视图的所有视图及PL/SQL程序都会变成INVALID状态。
更新视图的基础表后,视图会失效,可以对视图进行重编译使视图有效。Oracle会在视图被访问时自动重新编译这些视图。
也可以通过ALTER VIEW语句显式地重新编译视图,如:

ALTER VIEW v_deptemp COMPILE;

可以通过查询数据字典视图user_objects来获取视图的详细信息,如:

SELECT last_ddl_time, object_name, status
  FROM user_objects
 WHERE object_name = 'V_DEPTEMP';

删除视图

如:

DROP VIEW view_emp_dept;

当视图被删除之后,视图的定义会从数据字典中删除,在视图上授予的权限也被删除,其他引用该视图的视图及存储过程等都会失效。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
日常管理维护一个oracle数据库服务器的时,经常会碰到修改view,table结构的情况,而且由于oracle view,函数,存储过程等对象的相互关联的关系,经常会由于一个view,table,fun,proc的修改而导致相关的对象失效。而实施的时候,经常只会注意要修改的对象是否修改完成,往往忽略相关对象的失效问题,所以做了一个自动重新编译的脚本程序,目的是定期(10分钟)完成一次对所有对象的检查,如果有失效对象,则对其进行重新编译。 机制是:基于linux的crontab,定期执行下述脚本,对失效的对象,执行alter object_type object_name compile;语句,达到重新编译。 如果扩展该脚本,可以完成对失效的对象进行告警等管理的需要。 该脚本运行于oracle9i,linux 环境下面 #!/bin/sh nowdir=`pwd` #配置文件的生成日期 nowtime=`date '+%Y%m%d'` nowtime_h=`date '+%Y%m%d%H%M'` #脚本执行的目录 dmpdir=/oracle_script/auto_recompile #初始化参数 cd #执行oracle 相关的环境变量, . .bash_profile cd $dmpdir #下面取出失效的对象('TRIGGER','PROCEDURE','FUNCTION','VIEW), #并且去掉系统的对象,只针对用户自己部署的。 #如果有失效对象则完成alter sql语句。 rm -rf param.temp $ORACLE_HOME/bin/sqlplus -SILENT "/ as sysdba" <<eof set pagesize 1000 set linesize 100 set heading off set feedback off column table_name format a30 spool param.temp select 'alter '||a.object_type||' '||a.owner||'.'||a.object_name ||' compile;' from dba_objects a where a.object_type in('TRIGGER','PROCEDURE','FUNCTION','VIEW') and a.status='INVALID' and a.owner not in ('SYS' ,'SYSTEM','OUTLN','U_SYSTEM'); spool off exit; eof # Start to backup oracle database param echo "-------------- Complete obj compile Started on `date` -------------" >>$dmpdir/do.log dofilelog="obj_compile"$nowtime_h'.log' $ORACLE_HOME/bin/sqlplus -SILENT "/ as sysdba" <<eof SET serveroutput on long 999999 set pagesize 0 set linesize 300 spool $dofilelog @param.temp spool off exit; eof cat param.temp >> $dofilelog echo "-------------- Complete export End on `date` -------------" >>$dmpdir/do.log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值