我创建了一个像这样的随机视图:
CREATE OR REPLACE NOFORCE VIEW TEMP_VIEW (first_name, age) AS
SELECT 'Gladiolus' first_name, 23 age
FROM dual
/
我看看它:
SELECT * FROM temp_view
/
FIRST_NAME AGE
---------- ----------
Gladiolus 23
现在,当我打开源代码进行编辑时(使用PLSQL Developer和SQL Navigator),我得到了这个:
CREATE OR REPLACE VIEW TEMP_VIEW AS
SELECT 'Gladiolus' first_name, 23 age
FROM dual;
别名(first_name, age)
被省略,因为它们等于子查询的列。
但是你能告诉我为什么条款NOFORCE
也没有显示出来吗?
谢谢!
答案 0 :(得分:2)
某些关键字控制对象的创建方式,但它们不是对象定义的一部分。 Oracle并不总是关心"如何"创建了一个对象,并不总是存储用于创建它的选项。
当Oracle和第三方工具创建DDL语句时,他们必须猜测您要使用哪些选项。这些工具进行不同的猜测或语法差异很小,这种情况并不罕见。
(这是将所有DDL存储在版本控制的文本文件而不是数据库中的众多原因之一。您放入数据库的内容 NOT 与您获得的内容相同。 )
以另一种方式使用您的示例:
SQL> CREATE NOFORCE VIEW TEMP_VIEW (first_name, age) AS
2 SELECT 'Gladiolus' first_name, 23 age
3 FROM dual
4 /
View created.
视图是使用NOFORCE
创建的,没有OR REPLACE
。但DBMS_METADATA.GET_DDL
生成的DDL包含FORCE
,OR REPLACE
和其他差异:
SQL> select dbms_metadata.get_ddl('VIEW', 'TEMP_VIEW') from dual;
DBMS_METADATA.GET_DDL('VIEW','TEMP_VIEW')
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE EDITIONABLE VIEW "JHELLER"."TEMP_VIEW" ("FIRST_NAME",
"AGE") AS
SELECT 'Gladiolus' first_name, 23 age
FROM dual
真正的"来源"对象的内容根本不包含任何CREATE
选项:
SQL> select text from dba_views where view_name = 'TEMP_VIEW';
TEXT
--------------------------------------------------------------------------------
SELECT 'Gladiolus' first_name, 23 age
FROM dual
以下是从Oracle数据库重新生成代码时可能不同的不完整列表:
OR REPLACE
FORCE
| NOFORCE
AND RESOLVE
| AND COMPILE
(适用于Java)不同的DDL生成器允许您控制其中一些选项,但根据我的经验,它们都不能让您完全控制所有这些选项。
答案 1 :(得分:1)
NOFORCE
是默认值,因此保留它是多余的。