1

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

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

谢谢!!

4

2 回答 2

2

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

当 Oracle 和第 3 方工具创建 DDL 语句时,它们必须猜测您想使用哪些选项。工具做出不同猜测或语法差异很小的情况并不少见。

(这是将所有 DDL 存储在版本控制的文本文件而不是数据库中的众多原因之一。您放入数据库的内容与您取出的内容不同。)

以另一种方式使用您的示例:

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但是contains生成的 DDLFORCEOR 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. 终结者

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

于 2016-12-14T05:02:39.620 回答
1

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

于 2016-12-13T21:42:56.960 回答