最近碰到个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,
