下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

oracle视图的几个重要内容

作者:课课家教育the     来源: http://www.kokojia.com点击数:1493发布时间: 2017-05-18 11:00:40

标签: 数据库oracleoracle视图

  视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。今天小编要讲的就是 Oracle视图

      视图的定义:

  视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。

  视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。

  视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。

  视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。

  还有一种视图:物化视图(MATERIALIZEDVIEW),也称实体化视图,快照(8i以前的说法),它是含有数据的,占用存储空间。

  注:查询视图没有什么限制,插入/更新/删除视图的操作会受到一定的限制;所有针对视图的操作都会影响到视图的基表;为了防止用户通过视图间接修改基表的数据,可以将视图创建为只读视图(带上withreadonly选项)

  视图的优点:

  1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。

  2.用户通过简单的查询可以从复杂查询中得到结果。

  3.维护数据的独立性,试图可从多个表检索数据。

  4.对于相同的数据可产生不同的视图。

  视图的分类

  视图分为简单视图和复杂视图。

  两者区别如下:

  1.简单视图只从单表里获取数据,复杂视图从多表获取数据;

  2.简单视图不包含函数和数据组,复杂视图包含;

  3.简单视图可以实现DML操作,复杂视图不可以。

  视图的作用:

  1.提供各种数据表现形式,可以使用各种不同的方式将基表的数据展现在用户面前,以便符合用户的使用习惯(主要手段:使用别名);

  2.隐藏数据的逻辑复杂性并简化查询语句,多表查询语句一般是比较复杂的,而且用户需要了解表之间的关系,否则容易写错;如果基于这样的查询语句创建一个视图,用户就可以直接对这个视图进行"简单查询"而获得结果.这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种"数据字典视图"的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义);

  3.执行某些必须使用视图的查询.某些查询必须借助视图的帮助才能完成.比如,有些查询需要连接一个分组统计后的表和另一表,这时就可以先基于分组统计的结果创建一个视图,然后在查询中连接这个视图和另一个表就可以了;

  4.提供某些安全性保证.视图提供了一种可以控制的方式,即可以让不同的用户看见不同的列,而不允许访问那些敏感的列,这样就可以保证敏感数据不被用户看见;

  5.简化用户权限的管理.可以将视图的权限授予用户,而不必将基表中某些列的权限授予用户,这样就简化了用户权限的定义。

  视图的创建:

 oracle视图的几个重要内容_数据库_oracle_oracle视图_课课家教育

  权限:要在当前方案中创建视图,用户必须具有createview系统权限;要在其他方案中创建视图,用户必须具有createanyview系统权限.视图的功能取决于视图拥有者的权限.

  其中:

  ORREPLACE:若所创建的试图已经存在,ORACLE自动重建该视图;

  FORCE:不管基表是否存在ORACLE都会自动创建该视图;

  NOFORCE:只有基表都存在ORACLE才会创建该视图:

  alias:为视图产生的列定义的别名;

  subquery:一条完整的SELECT语句,可以在该语句中定义别名;

  WITHCHECKOPTION:插入或修改的数据行必须满足视图定义的约束;

  WITHREADONLY:该视图上不能进行任何DML操作。

  例如:

代码

  视图的定义原则:

  1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询;

  2.在没有WITHCHECKOPTION和READONLY的情况下,查询中不能使用ORDERBY子句;

  3.如果没有为CHECKOPTION约束命名,系统会自动为之命名,形式为SYS_Cn;

  4.ORREPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。

  查询视图:

  视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。

  示例:

  SQL>SELECT*FROMdept_sum_vw;

  修改视图:

  通过ORREPLACE重新创建同名视图即可。

  删除视图:

  DROPVIEWVIEW_NAME语句删除视图。

  删除视图的定义不影响基表中的数据。

  可以删除当前模式中的任何视图;

  如果要删除其他模式中的视图,必须拥有DROPANYVIEW系统权限;

  视图被删除后,该视图的定义会从词典中被删除,并且在该视图上授予的“权限”也将被删除。

  视图被删除后,其他引用该视图的视图及存储过程等都会失效。

  查询视图定义:

  SELECTview_name,textfromuser_views;

  其中text显示的内容为视图定义的SELECT语句,可通过DESCUSER_VIEWS

  得到相关信息。

  视图上的DML操作:

  DML操作应遵循的原则:

  1.简单视图可以执行DML操作;

  2.在视图包含GROUP函数,GROUPBY子句,DISTINCT关键字时不能删除数据行;

  3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:

  a.视图中包含GROUP函数,GROUPBY子句,DISTINCT关键字;

  b.使用表达式定义的列;

  c.ROWNUM伪列。

  d.基表中未在视图中选择的其他列定义为非空且无默认值。

  WITHCHECKOPTION子句

  通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。(也就是说在执行INSERTS、UPDATES时,WHERE条件中除需要INSERT、UPDATE本身的限制条件之外,还需要加上视图创建时的WHERE条件。)

  例如:

 其中text显示的内容为视图定义的SELECT语句,可通过DESCUSER_VIEWS    得到相关信息。    视图上的DML操作:    DML操作应遵循的原则:    1.简单视图可以执行DML操作;    2.在视图包含GROUP函数,GROUPBY子句,DISTINCT关键字时不能删除数据行;    3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:    a.视图中包含GROUP函数,GROUPBY子句,DISTINCT关键字;    b.使用表达式定义的列;    c.ROWNUM伪列。    d.基表中未在视图中选择的其他列定义为非空且无默认值。    WITHCHECKOPTION子句    通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。(也就是说在执行INSERTS、UPDATES时,WHERE条件中除需要INSERT、UPDATE本身的限制条件之外,还需要加上视图创建时的WHERE条件。)   

  1,Oracle是可以通过视图来修改Basetable的。所谓basetable就是用来构建视图的表,也就是视图的数据来源表。但是这种修改是有条件的。比如:

  createviewv_empasselectempno,ename,job,deptnofromempwheredeptno=10withcheckoptionconstraintemp_cnst;

  如果有这个限制,那么通过视图v_emp插入数据的deptno字段的值必须是10,否则就会报“ORA-01402:视图WITHCHECKOPTIDN违反where子句”的异常。

  2,联结视图:

如果有这个限制,那么通过视图v_emp插入数据的deptno字段的值必须是10,否则就会报“ORA-01402:视图WITHCHECKOPTIDN违反where子句”的异常。    2,联结视图:

  将两个表的数据联结起来,看起来应该是一个内联结(Innerjoint)。

  对于联结视图(Jointview)的修改规则稍显复杂,设计到所谓key_preservedtable的概念。通过联结视图来修改基表,只有那些key_preserved的表才能被修改。上述创建视图语句中emp和dept通过deptno进行联结构成视图时,emp就是key_preserved表,而dept不是。为什么?因为在dept1_staff中empno的值唯一的而deptno不是唯一的。所以emp是key_preserved而dept不是。因此只能通过该视图来修改emp,而不能修改dept的数据。

  3,Oracle视图非常强大的功能之一在于其可以创建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成视图里的该字段名称,那么视图马上就可以成为合法的。这个功能很有意思。

  例子:

  创建基表:createtablev_test(namevarchar2(32),agenumber(12));

  创建带错误的视图:

  createforceviewview_testasselectname,age,addressfromv_test;(注意加上force选项)

  由于address字段在v_test里不存在,所以会报warning:Viewcreatedwithcompilationerrors的警告,而且执行select*fromview_test;时会报“ORA-04063:view“SCOTT.VIEW_TEST”有错误”的异常。

  但是如果在v_test里加上address字段,那么视图就会合法。

  对基表进行修改:

  altertablev_testadd(addressvarchar2(128));

  现在再执行select*fromview_test;就会执行成功了。

  小编结语:

  更多内容尽在课课家教育~~

赞(24)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程