第8章 视图.docx
《第8章 视图.docx》由会员分享,可在线阅读,更多相关《第8章 视图.docx(23页珍藏版)》请在冰点文库上搜索。
第8章视图
【本章导读】
视图是Oracle数据库中的一种逻辑结构,它来源于数据表,只存储其定义,并不存储数据。
在简化数据库应用程序、隐藏数据表的结构和实现权限控制等方面可以发挥视图的优势。
可以像使用数据表一样使用视图,包括执行数据查询和数据更新。
读者学习完本章以后,应该了解以下内容:
l 视图的基本知识
l 创建、修改、查看和删除视图
l 使用视图
8.1 视图概述
视图(View)是从一个或多个表(其他视图)中导出的表,其结构和数据是建立在对表的查询基础上的。
和表一样,视图也包括几个被定义的数据列和多个数据行,但就本质而言,这些数据列和数据行来源于其所引用的表。
所以视图不是真实存在的基础表,而是一张虚表。
视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表一样在数据库中另外存储一份,通过视图看到的数据只是存放在基表中的数据。
对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)和删除。
当对视图中的数据进行修改时,相应的基表的数据也要发生变化,同时,如果基表的数据发生变化,则这种变化也可以自动地反映到视图中。
视图有很多优点,主要表现在:
(1)视点集中,减少对象大小
视图让用户能够着重于他们所需要的特定数据或所负责的特定要求,如用户可以选择特定行或特定列,不需要的数据可以不出现在视图中,增强了数据的安全性;而且视图并不实际包含数据,Oracle只在数据库中存储视图的定义。
(2)从异构源组织数据
可以在连接两个或多个表的复杂查询的基础上创建视图,这样可以将单个表显示给用户,即分区视图。
分区视图可基于来自异构源的数据,如远程服务器,或来自不同数据库中的表。
(3)隐藏数据的复杂性,简化操作
视图向用户隐藏了数据库设计的复杂性,这样如果开发者改变数据库设计,不会影响到用户与数据库交互。
另外,用户可将经常使用的连接查询、嵌套查询或联合查询定义为视图,这样,用户每次对特定的数据执行进一步操作时,不需指定所有条件和限定,因为用户只需查询视图,而不需再提交复杂的基础查询。
8.2 创建视图
视图在Oracle数据库中作为一个数据库对象被存储。
在创建视图之前,首先需要保证创建视图的用户已经获得CREATEVIEW系统权限的授权,并且具有操作视图所涉及的表或其他视图的权限。
在Oracle11g中,既可以使用SQLDeveloper创建视图,也可以使用PL/SQL中的CREATEVIEW语句创建视图。
在创建视图之前,先以SYSDBA身份登录SQLDeveloper,执行以下语句以使SCOTT用户获得创建视图的系统权限。
GRANTCREATEVIEWTOSCOTT;
8.2.1 使用SQLDeveloper创建视图
在SQLDeveloper中创建视图时,首先必须以具有CREATEVIEW系统权限及具有操作视图所涉及的表或其他视图的权限的用户账户登录SQLDeveloper,如系统账户SYS或者SYSTEM等。
以SCOTT用户登录SQLDeveloper,创建视图的过程如下:
在SQLDeveloper中,右击Views选项,从快捷菜单中选择“NewView”项,如图8-1所示。
图8-1 选择新建视图
在打开的“CreateView”对话框中,选择用户方案为SCOTT,指定视图的名称为VWALLPRODUCT,并在SQLQuery框内编写定义视图的查询语句,如图8-2所示。
单击DDL选项卡,可以看到该视图创建操作对应的PL/SQL语句:
CREATEVIEWVWALLPRODUCT
AS
SELECT *
FROM SCOTT.PRODUCT;
图8-2 定义视图
单击“TestSyntax”按钮,以检查该PL/SQL语句的语法,如果创建视图的代码没有错误,将在SQLParseResults区域显示“NoerrorsfoundinSQL”信息,如图8-3所示;否则显示相应的错误消息。
用户也可以选中Advanced复选框,打开创建视图的高级选项,如图8-4所示。
图8-3 检查创建视图的PL/SQL代码 图8-4 创建视图的高级选项
使用高级选项,用户可以可视化的方式创建视图。
以添加WHERE子句为例,用户从SQLQuery部分选择“WHEREclause”选项,出现针对产品表PRODUCT进行查询条件的设置,从“ExpressionPalette”部分选择CATEGORYID属性,单击“<”按钮,补充WHERE区域的WHERE子句,如图8-5所示。
图8-5 使用高级选项添加查询子句
在编写完PL/SQL查询语句以后,单击“确定”按钮完成视图的创建。
刷新Views选项后,选择创建的视图VWALLPRODUCT,选择该视图的Data选项卡,可以查看该视图中的数据,它包含了所有“T001”类的产品信息,如图8-6所示。
图8-6 查看视图中的数据
8.2.2 使用PL/SQL创建视图
PL/SQL中用于创建视图的语句是CREATEVIEW命令,其基本语法格式如下:
CREATE[ORREPLACE][FORCE][NOFORCE]VIEW[用户方案.]<视图名>
[(列名[,…n])]
AS
SELECT语句
[WITHCHECKOPTION[CONSTRAINT约束名]]
[WITHREADONLY];
参数说明:
(1)REPLACE:
在创建视图时,如果存在同名视图,则重新创建;若未使用REPLACE关键字,则只有在先删除原来视图后,才能创建同名视图;
(2)FORCE:
强制创建视图,无论视图的基表是否存在或者拥有者是否有权限,但SELECT、INSERT、UPDATE和DELETE语句的前提条件必须为真;
(3)视图名:
要建立的新视图的名称,其名字必须符合PL/SQL标识符的定义规则,而且在同一个用户方案下视图名必须是唯一的;
(4)列名:
组成视图的各个属性的名称,在一个视图中,列名也必须是唯一的;
(5)SELECT语句:
指定创建视图的SELECT语句,可以在SELECT语句中查询多个表或视图;
(6)WITHCHECKOPTION:
指出在视图上所进行的修改需要符合SELECT语句所指定的限制条件,这样可以确保数据修改后,仍然可以通过视图查看修改的数据;
(7)WITHREADONLY:
设置视图中不能执行INSERT、UPDATE和DELETE操作,只能检索数据。
对于视图列名的设置,在以下几种情况下必须指定视图的列名:
(1)由算术表达式、系统内置函数或者常量得到的列;
(2)视图中的列名与基表中的列名不相同的时候;
(3)共享同一个表名连接得到的列。
【例8-1】为用户方案SCOTT创建视图VWALLPRODUCT,该视图包括产品的产品编号、产品类别编号、产品名称和产品说明。
CREATEORREPLACEVIEWSCOTT.VWALLPRODUCT
AS
SELECT *
FROM SCOTT.PRODUCT;
【例8-2】为用户方案SCOTT创建视图VWPRODUCT_CHN,该视图包括产品的产品编号、产品名称、类别编号、类别名称和产品说明,并以中文显示列名。
CREATEORREPLACEVIEWSCOTT.VWPRODUCT_CHN
(产品编号,产品名称,类别编号,类别名称,产品说明)
AS
SELECT PRODID,PRODNAME,P.CATEGORYID,CATEGORYNAME,DESCRIPTION
FROM SCOTT.PRODUCTP
JOIN SCOTT.CATEGORYC
ON P.CATEGORYID=C.CATEGORYID;
执行例8-1和例8-2的PL/SQL代码后,刷新Views选项,分别展开VWALLPRODUCT和VWPRODUCT_CHN,其中后者的属性名称使用中文显示,如图8-7所示。
图8-7 比较视图的结构
【例8-3】为用户方案SCOTT创建视图VWSUPPLYPRODUCT,该视图包括产品的产品编号、供应商编号、产品名称、单价和数量,并以中文显示属性名称。
CREATEORREPLACEVIEWSCOTT.VWSUPPLYPRODUCT
(产品编号,供应商编号,产品名称,单价,数量)
AS
SELECTP.PRODID,SUPPID,PRODNAME,PRICE,QUANTITY
FROMSCOTT.PRODUCTP
JOINSCOTT.SUPPLYS
ONP.PRODID=S.PRODID;
8.3 修改视图
随着查询要求的改变和数据源的变化,必然要求视图能够进行编辑修改。
在Oracle中,既可以对视图进行重命名,也可以修改视图的定义,修改方式也可以分为SQLDeveloper和PL/SQL两种。
8.3.1 使用SQLDeveloper修改视图
1.重命名视图
在SQLDeveloper中,右击Views选项下的视图VWALLPRODUCT,从快捷菜单中选择“Rename”项,如图8-8所示。
图8-8 选择重命名视图
在打开的“Rename”对话框中,设置视图的新名称为VWALLPRODUCTS,如图8-9所示。
单击“应用”按钮,弹出如图8-10所示的确认对话框,单击“确定”按钮,完成视图的重命名操作。
图8-9 设置视图的新名称 图8-10 确认重命名视图
2.修改视图定义
在SQLDeveloper中,右击Views选项下的视图VWALLPRODUCTS,从快捷菜单中选择“Edit”项,如图8-11所示。
在打开的“EditView”对话框中,在SQLQuery文本框内修改视图VWALLPRODUCTS的定义语句,如图8-12所示。
图8-11 选择编辑视图 图8-12 修改视图定义语句
单击“TestSyntax”按钮,检查修改视图的PL/SQL是否存在语法错误。
如果没有语法错误,则单击“确定”按钮,完成视图的修改定义操作。
8.3.2 使用PL/SQL修改视图
1.重命名视图
Oracle提供了rename命令来重命名视图,其基本语法格式为:
rename旧视图名TO新视图名;
【例8-4】重命名用户方案SCOTT的视图VWALLPRODUCT为VWALPRODUCTS。
renameVWALLPRODUCTTOVWALLPRODUCTS;
2.修改视图定义
Oracle的PL/SQL语句提供了ALTERVIEW命令,但是它只用于重新编译或者验证现有视图,而不能用于修改视图定义。
对于视图来说,若其基础表不存在,则编译后该视图的状态为“无效”,不能在该视图的基础上执行一些操作,如查询等。
当下次访问该视图时,数据库会对这个视图进行重新编译,若此时基表存在了,则该视图就会变为有效;若基表不存在,则该视图就会失效。
在SQLDeveloper中的Views选项下右击需要进行编译的视图,从快捷菜单中选择“Compile”选项,如图8-13所示。
在打开的Compile对话框中,显示了确认编译的提示信息,如图8-14所示。
图8-13 选择编译视图 图8-14 确认编译视图信息
单击SQL选项卡,显示了该编译操作的PL/SQL代码,如图8-15所示。
单击“应用”按钮,完成视图的编译操作,如图8-16所示。
图8-15 显示编译操作的PL/SQL代码 图8-16 完成视图的编译操作
若要使用PL/SQL修改视图的定义,可以使用CREATEORREPLACEVIEW命令。
【例8-5】修改用户方案SCOTT的视图VWALLPRODUCTS,将该视图的列全部以中文显示。
CREATEORREPLACEVIEWSCOTT.VWALLPRODUCT
(产品编号,产品类型编号,产品名称,产品描述)
AS
SELECT *
FROM SCOTT.PRODUCT;
修改视图而不是先删除后再重建视图的优势在于,所有相关的权限等安全性内容依然存在。
如果是删除视图再重建相同名称的视图,Oracle则将该视图作为不同的视图来对待。
8.4 查看视图
在Oracle中查看视图时,既可以通过SQLDeveloper工具查看视图的结构、数据等详细信息,也可以使用PL/SQL语句中的DESCRIBE命令查看视图的结构。
8.4.1 使用SQLDeveloper查看视图
在SQLDeveloper中,选中Views选项下的视图VWALLPRODUCTS,将在右边栏内显示VWALLPRODUCTS视图的信息,如视图所包含的列、数据、所获得的授权等,如图8-17所示。
图8-17 查看视图
8.4.2 使用PL/SQL查看视图
Oracle的PL/SQL语句提供了DESCRIBE命令用来查看视图的信息,其基本语法格式为:
DESC[RIBE] [用户方案.]视图名;
【例8-6】查看用户方案SYSTEM的视图VWALLPRODUCTS的信息。
DESC SCOTT.VWALLPRODUCTS;
使用DESCRIBE命令查看视图与在SQLDeveloper中查看视图得到的信息是相差很大的,前者只能得到定义视图的结构信息,而后者可以得到除此之外更为丰富的信息。
8.5 删除视图
删除视图时,只是删除视图结构的定义,对于视图所包含的数据,并不会随着视图的删除而被删除,它们依然存储在与视图相关的基表中。
用户既可以通过SQLDeveloper工具删除视图,也可以通过PL/SQL语句中的DROPVIEW命令删除视图。
当前用户必须具有DROPANYVIEW的系统权限才可以删除视图,通过以下语句给SCOTT用户授权:
GRANTDROPANYVIEWTOSCOTT;
8.5.1 使用SQLDeveloper删除视图
在SQLDeveloper中,右击Views选项中的待删除视图VWALLPRODUCTS,从快捷菜单中选择“Drop”项,如图8-18所示。
图8-18 选择删除视图
打开如图8-19所示的“Drop”对话框,单击“应用”按钮将删除该视图,单击“取消”按钮将撤销删除视图的操作。
图8-19 删除视图
单击“应用”按钮,弹出如图8-20所示的确认对话框,单击“确定”按钮,完成删除视图操作,视图VWALLPRODUCTS的定义将被删除。
图8-20 确认删除
8.5.2 使用PL/SQL删除视图
Oracle的PL/SQL语句提供了DROPVIEW命令来删除视图,其基本语法格式为:
DROP VIEW [用户方案.]视图名;
【例8-7】删除用户方案SCOTT的视图VWPRODUCT_CHN的信息。
DROP VIEW SCOTT.VWPRODUCT_CHN;
8.6 使用视图
视图具有和数据表一样的结构,当定义视图以后,用户可以像对基表一样对视图进行操作,如对视图进行查询、插入、修改和删除等操作。
8.6.1 查询视图
在Oracle中使用SELECT语句查询视图所包含的数据,其使用方法与查询基表的数据相同。
与直接通过基表进行连接查询不同,视图的结构经过了简化,它由基本查询语句生成视图的定义,直接对视图进行查询即可,并不需要对与视图有联系的多个基表进行查询操作,大大减少了查询语句的复杂度。
【例8-8】通过用户方案SCOTT的视图VWALLPRODUCTS查询所有产品的产品编号、产品名称和产品说明。
SELECT *
FROM SCOTT.VWALLPRODUCTS;
执行上述查询,显示查询结果如下所示:
PRODID CATEGORYID PRODNAME DESCRIPTION
产品编号 产品类型编号 产品名称 产品描述
---------------------------------------------------------------------------------------------------------------------------------
P070920001 T001 红玫瑰 红玫瑰能表达情侣之间的爱意
P070920002 T001 黑色郁金香 黑色郁金香代表独特领袖权力
P070920003 T001 百合花 白百合代表着纯洁、优雅、高贵