视图创建语法:
CREATE [OR REPLACE] VIEW 视图名称
AS 子查询
1.#创建一张视图
#scott用户没有创建视图的权限,如果直接创建视图,会返回以下错误提示:
ORA-01031: insufficient privileges
#使用以下命令放权(sys用户下放权限)
GRANT CREATE VIEW TO c##SCOTT;
#执行下面语句查询myview
SELECT * FROM MYVIEW;
我们发现,通过一个简单的视图查询操作,就可以完成之前的复杂SQL语句的功能,所以视图就是包装了的SQL查询操作。
2.#创建一张包含简单查询语句的视图
CREATE VIEW MYVIEW AS
SELECT * FROM EMP WHERE DEPTNO=20;
执行上面语句会返回以下错误提示:
ORA-00955: name is already used by an existing object
#drop掉之前创建的视图myview
DROP VIEW MYVIEW;
#然后再次执行
CREATE VIEW MYVIEW AS
SELECT * FROM EMP WHERE DEPTNO=20;
语句执行成功,上面的操作实际上是属于一个视图的替换操作,所以此时可以使用另外一种语法:
CREATE OR REPLACE VIEW MYVIEW AS
SELECT * FROM EMP WHERE DEPTNO=20;
表示如果视图存在则替换,不存在则创建。
创建视图有两个选项:
选项一:WITH CHECK OPTION
以上创建的视图,是存在一个创建条件的,如“WHERE DEPTNO=20”,那么如果更新该条件呢?
#更新条件
UPDATE MYVIEW SET DEPTNO=30 WHERE EMPNO=7369;
#查询该视图,发现SMITH用户的信息已不存在,该用户的部门信息已经更改。
SELECT * FROM MYVIEW;
此时更新的是一张视图,但是视图本身并不是一个具体的数据表,而且现在更新的操作又是视图的创建条件,这样的做法不可取,为了解决这个问题,可以加入WITH CHECK OPTION.
#回滚数据表:
ROLLBACK;
#创建一个视图
CREATE OR REPLACE VIEW MYVIEW AS
SELECT * FROM EMP WHERE DEPTNO=20
WITH CHECK OPTION;
#再次更新视图的更新操作:
UPDATE MYVIEW SET DEPTNO=30 WHERE EMPNO=7369;
UPDATE MYVIEW SET sal=5000 WHERE EMPNO=7369;
#出现以下错误提示:
ORA-01402: view WITH CHECK OPTION where-clause violation
现在已经无法更新视图的创建条件。
(check option 只固定了 where后面的字段,其他字段仍可以更改)虽然使用WITH CHECK OPTION可以保证视图的创建条件不被更新,但是其他的字段却允许更新。
选项二:WITH READ ONLY
#查询视图,发现SMITH的SAL值已经更改,和上一个问题一样,视图本身不是具体的真实数据,而是一些查询语句,所以这样更新并不合理,据此,我们可以在创建视图的时候建议设置为只读视图。
CREATE OR REPLACE VIEW MYVIEW AS
SELECT * FROM EMP WHERE DEPTNO=20
WITH READ ONLY;
#再次进行更新操作
UPDATE MYVIEW SET SAL=9000 WHERE EMPNO=7369;
返回以下错误提示:
ORA-42399: cannot perform a DML operation on a read-only view
以上是一个简单的的操作语句视图,==如果视图中的查询语句是统计操作,则根本就不可能更新,==如下:
#创建一个视图:
#查看视图查询结果
SELECT * FROM MYVIEW;
#执行更新操作;
UPDATE MYVIEW SET COUNT=30 WHERE DEPTNO=10;
执行之后,返回如下错误提示:
ORA-01732: data manipulation operation not legal on this view
== 该信息是统计而来的,根本就不可能更新。==
项目中,视图的数量可能多于表的数量。
另外
#查看视图的字段
desc myview
#查看视图具体的定义
SELECT * FROM USER_VIEWS;
来源:CSDN
作者:其实@qq.com
链接:https://blog.csdn.net/qq_45630589/article/details/104310715