当我打开View源时,“NOFORCE”条款消失

时间:2016-12-13 21:32:50

标签: sql oracle plsqldeveloper sql-navigator

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

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

谢谢!

2 个答案:

答案 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包含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

真正的"来源"对象的内容根本不包含任何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. 终止子
  9. 不同的DDL生成器允许您控制其中一些选项,但根据我的经验,它们都不能让您完全控制所有这些选项。

答案 1 :(得分:1)

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