oracle 视图的编译

视图依赖于基础表的存在而存在,当基础表进行了结构上的修改后,有可能会对视图产生印象,如果要再次使用此试图,需要进行编译。

基础表如下:

 

基础表
1 create table employee
2 (
3 employ_id number primary key,
4 first_name nvarchar2(10),
5 last_name nvarchar2(10),
6 province varchar2(10),
7 city varchar2(10),
8 salary number
9 )

 

视图

销售人员的月薪
1 create or replace view v$employee$sales
2 as
3 select employ_id,family_name||first_name as employeename,salary+total_price*0.1 as salary
4 from employee e join employee_sales  es on e.employ_id=es.sale_by

先查看视图的状态、可用性

SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE=UPPER('VIEW') AND OBJECT_NAME =UPPER('v$employee$sales')

结果如下

可以看到状态为 VALID(可用的)

此时向表employee中添加一列Age

添加一列
1 alter table employee
2 add age number

再次运行 SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE=UPPER('VIEW') AND OBJECT_NAME=UPPER('v$employee$sales')

结果如下

因为基础表的结构发生了变化,所以此时的Status状态变为INVALID(无效的)

在重新编译之前,不能使用此视图

编译视图

alter view v$employee$sales compile

再次查询其状态

再次编译后,视图状态为可用。

其实只要对视图执行一次查询,就可以将试图的状态置位可用(oracle在执行真正的查询前,会自动编译视图)

实际上,只有修改表的结构后才会影响视图的有效性,而修改表的数据不会影响视图的有效性。

但是,并非针对所有基础表的修改后,通过编译视图都可以通过。比如修改基础表的列名

alter table employee rename column first_name to firstname

查询视图状态

SELECT OBJECT_NAME,STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE=UPPER('VIEW') AND OBJECT_NAME =UPPER('v$employee$sales')

编译视图 v$employee$sales

因为我们已经把first_name 修改为firstname

只有我们针对视图进行修改,才能顺利通过

View Code
1 create or replace view v$employee$sales
2 as
3 select employ_id,family_name||firstname as employeename,salary+total_price*0.1 as salary
4 from employee e join employee_sales  es on e.employ_id=es.sale_by
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值