当我打开查看源代码时,子句 "NOFORCE" 消失了

When I open a View source, the clause "NOFORCE" disappear

我创建了一个这样的随机视图:

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 也没有显示吗?

谢谢!!

NOFORCE 是默认值,因此保留它是多余的。

一些关键字控制对象的创建方式,但它们不是对象定义的一部分。 Oracle 并不总是关心 "how" 对象的创建,并不总是存储用于创建它的选项。

当 Oracle 和第 3 方工具创建 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包含FORCEOR 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

对象的真实"source"根本不包含任何CREATE选项:

SQL> select text from dba_views where view_name = 'TEMP_VIEW';

TEXT
--------------------------------------------------------------------------------
SELECT 'Gladiolus' first_name, 23 age
  FROM dual

以下是从 Oracle 数据库重新生成代码时可能有所不同的不完整列表:

  1. OR REPLACE
  2. FORCE|NOFORCE
  3. AND RESOLVE|AND COMPILE(对于Java)
  4. 空格
  5. 案例
  6. 列列表
  7. 双引号
  8. 终结者

不同的 DDL 生成器允许您控制其中的一些选项,但根据我的经验,none 它们可以让您完全控制所有这些选项。