oracle 视图


 create or replace view emp_v
 as select * from emp where sal>1500;

我们建立了一个视图,并且sql>1500,那么我们向视图emp_v插入一条记录,sal为1350

 

 insert into emp_v values(7905,'myview','IT',7782,'23-1月-83',1350,10,20);

这样做就会出现一个问题,当我们再次查看emp_v时,并没有发现刚插入的数据。那主要是英文插入的数据不符合条件sal>1500所致。

但我们使用select * from emp;进行查询时,刚才的插入的那条记录已经插入emp表里了。

 

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81       1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81       1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81       2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81       2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87       3000                    20
      7839 KING       PRESIDENT            17-11月-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81       1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87       1100                    20

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 03-12月-81        950                    30
      7902 FORD       ANALYST         7566 03-12月-81       3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82       1300                    10
      7905 myview     IT              7782 23-1月 -83       1350         10         20

 

这样就会产生一个令人困惑的现象,但我们有一个解决的办法,就是在创建视图的时候,当sal<1500的时候就不能插入了,这样可以保持前后一致。我们修改创建视图的语句,加上一句,with check option;

create or replace view emp_v
as select * from emp where sal>1500

with check option; 

 

我们再次插入刚才的那条语句,那么就会处理错误,
SQL>  insert into emp_v values(7905,'myview','IT',7782,'23-1月-83',1350,10,20);
 insert into emp_v values(7905,'myview','IT',7782,'23-1月-83',1350,10,20)
             *
ERROR 位于第 1 行:
ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句

 

我们可以创建一个只读的视图:

create or replace view v_read

as

select * from emp

with read only;

这是我们就不能对视图进行更新了。

 

我们可以通过desc user_views查看当前用户的视图:


SQL> desc user_views;
 名称                  
 ---------------------
 VIEW_NAME             
 TEXT_LENGTH           
 TEXT                  
 TYPE_TEXT_LENGTH      
 TYPE_TEXT             
 OID_TEXT_LENGTH       
 OID_TEXT              
 VIEW_TYPE_OWNER       
 VIEW_TYPE             
 SUPERVIEW_NAME        

你可能感兴趣的:(oracle,sql,manager,user,insert)