日期:2014-05-16  浏览次数:20484 次

对视图进行DML操作的介绍

以前只知道视图可以用来查询,最近才知道,原来视图还是可以像普通表一样进行增、删、改操作的。而我们通常用写的视图虽然仅仅只是用来进行查询,而且在建立查询视图的时候,我们从来没有考虑到将视图建立成只读格式,我意识到,事实上我们的视图是不安全的。
接下来,我将详细说明如何对视图进行数据的添加、修改和删除。
在切入主题之前,首先说明一下视图的格式定义:


?

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW YOUR_VIEW_NAME
        (COLNAME1,COLNAME2,COLNAME3,...,COLNAMEn)
AS
        [YOUR_QUERY_STATEMENTS WILL WRITE HERE !]
        [WITH CHECK OPTION [CONSTRAINTNAME constraint_name]]
        [WITH READ ONLY]?


说明:
??? 首先我想说一下 FORCE 与 NOFORCE 的区别,有时候你在创建视图时可能会报一个“表或视图”不存在的错误。如果选择了 FORCE 选项,不论你的 SQL 是否有问题,只要符合语法规则,Oracle 都会按照你的意图将其创建。这样你就可以在视图建立好以后再建表,或者向表中加字段。
其次就是 WITH CHECK OPTION ,这个条件一般对于查询类视图是没有太大的用途的。但是如果你要执行DML操作,那么,这个检查将会限制你只能访问被 Where 子句所限制了的记录。更或者确切的说,如果你所执行的操作影响到视图中的一条记录不再满足视图的限制条件,那么,Oracle 就不会允许你进行该操作。这样,事实上就保证了视图中数据的完整性。
最后,也是最重要,用来保证视图安全性的 WITH READ ONLY 指令。默认情况下,Oracle中的视图如果没有申明只读,理论上都可以执行DML操作。因此,如果要保证你的视图是只读的,那就应该显式声明一下。其 实,如果业务上没有在视图上执行 DML 操作的需求的话,一般建议在建立视图时都将其声明为只读格式的,这样不但保证了视图中数据不会被非法修改,而且从一定程度上还可以提升视图的执行效率。

??? 说了半天的闲话,我们现在开始聊聊如何对视图执行DML操作。如果是简单视图,而且没有声明 WITH READ ONLY 那你就放心大胆的执行吧,没什么不行的,为了说明问题,我们先小试牛刀。



一:简单视图执行的 DML 操作

首先,将设库中已经有Dept这张表,我们建一个视图,命名为 V_Dept ,定义过程如下:

1>用到的表定义:


?

CREATE TABLE DEPARTMENT
(
DEPARTMENTID VARCHAR2(32 BYTE)               NOT NULL,
NAME          VARCHAR2(32 BYTE)               NOT NULL,
INNERCODE     VARCHAR2(3 BYTE)                NOT NULL,
FULLNAME      VARCHAR2(32 BYTE),
STATUS        VARCHAR2(1 BYTE)                NOT NULL,
COMMENTS      VARCHAR2(100 BYTE)
)?


2>视图定义:


CREATE OR REPLACE VIEW V_Dept
    AS SELECT * FROM DEPT?


??? 从定义中可以看出,事实上我们这里的定义方式跟 Oracle 视图定义的标准格式还有些出入,不过没关系,Oracle 在遇到没有定义字段名的视图时他会自动将原表中的字段名称当做视图的字段名称。执行编译,系统提示view created 。OK,我们接下来对这个简单视图进行数据的修改、增加和删除。

首先我们对视图进行一次数据查询,执行如下:


?

select * from v_dept?

返回消息>>11 rows return

OK , 首先保证我们的表中有数据(没有数据的仁兄们就得自己想办法喽^^)。然后小试牛刀让我们来执行一条插入语句:


?

Insert into v_dept
   (DEPARTMENTID, NAME, INNERCODE, FULLNAME, STATUS, COMMENTS)
Values
   ('SP13618d5cWWWWW', '后勤公司', '17', '后勤服务公司', '0', '主要用于教学场地的管理');
COMMIT;?

返回消息>>1 row inserted

OK , 说明简单视图可以执行插入语句,接下来我们再试一下修改语句,我们同样还是修改刚才插入的这条记录:


修改:update v_dept set DEPARTMENTID='SP13618d5c' where DEPARTMENTID='SP13618d5cWWWWW';
删除:delete v_dept where DEPARTMENTID='SP13618d5c'


执行上面的两条语句,我们可以看到对于简单视图我们可以像对真实表一样进行 DML 操作。那么对于复杂视图呢?

二:复杂视图在有条件的情况下执行 DML 操作。

具体的限制条件如下:
1〉不允许违反约束的 DML 操作。
2〉不能将一个值添加到包含算术表达式的列中
3〉在非 key-preserved 表上不允许 DML 操作 .
4〉在包含组函数、GROUP BY 子句、ROWNUM伪列或DISTINCT关键字的视图上不允许 DML 操作。