Oracle强制创建视图的操作

最近碰到个Oracle视图的问题,有很多值得学习了解的。其中一点就是create force view的创建方式。

概括来讲,"Forces The Creation Of A View Even When The View Will Be Invalid. NoForce Is The Default",FORCE关键字的意思,就是即使视图此刻是无效的,依然允许创建,默认创建是NOFORCE。

通过实验了解下。

(1)数据库此刻没有名叫tbl的表,默认创建view会提示错误,

CREATE VIEW v_test_01 AS SELECT * FROM tbl;ORA-00942: 表或视图不存在

(2)官方文档对FORCE进行了说明,

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-views-sequences-and-synonyms.html#GUID-655BC560-5588-4B05-83AB-C3C69818078C

执行FORCE属性的视图创建语句,没提示错误,

CREATE FORCE VIEW v_test_01 AS SELECT * FROM tbl;

但是检索视图,会提示错误,

SELECT * FROM v_test_01;ORA-04063: view "BISAL.V_TEST_01" 有错误

视图的状态,也是无效的,因此通过FORCE属性,可以强制创建view,

SELECT object_name, object_type, status   FROM dba_objects  WHERE object_name='V_TEST_01'; |OBJECT_NAME|OBJECT_TYPE|STATUS | --------------------------------- |V_TEST_01  |VIEW       |INVALID|

(3)创建出基表,

CREATE TABLE tbl(id number);

但此时,视图状态仍然是INVALID,

SELECT object_name, object_type, status   FROM dba_objects  WHERE object_name='V_TEST_01'; |OBJECT_NAME|OBJECT_TYPE|STATUS | --------------------------------- |V_TEST_01  |VIEW       |INVALID|

只有当alter view ... compile强制重新编译,

ALTER VIEW v_test_01 compile;

或者执行一次这张视图的检索,

SELECT * FROM v_test_01;

就可以将视图状态改为VALID,last_ddl_time字段会显示最新的创建时间,

SELECT object_name, object_type, status, last_ddl_time  FROM dba_objects  WHERE object_name='V_TEST_01'; |OBJECT_NAME|OBJECT_TYPE|STATUS |LAST_DDL_TIME| ----------------------------------------------- |V_TEST_01  |VIEW       |VALID  |当前最新的时间|

官方文档对依赖对象的生效,进行了说明,

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-schema-objects.html#GUID-46D82F8E-C360-4223-B469-18039B1FFB21

因此,当基表存在问题等的场景下,可以通过FORCE,创建出视图,但是,当基表可正常使用时,视图才能正常用。


如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,




近期更新的文章:
最近碰到的一些问题
这次的"室温超导"爆炸性发现,会是人类的进步?
国务院机构改革方案的学习
MySQL日志 - Redo Log重做日志
图表数字化的制作神器

近期的热文:
推荐一篇Oracle RAC Cache Fusion的经典论文
"红警"游戏开源代码带给我们的震撼

文章分类和索引:
公众号1100篇文章分类和索引

请使用浏览器的分享功能分享到微信等