2016-12-13 97 views
1

我创建了一个随机查看这样的:当我打开查看源代码,该条款“NOFORCE”消失

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导航)我得到这样的:

CREATE OR REPLACE VIEW TEMP_VIEW AS 
SELECT 'Gladiolus' first_name, 23 age 
    FROM dual; 

别名(first_name, age)是中省略,因为它们一等于子查询的列。

但是,你能告诉我为什么NOFORCE也没有显示?

谢谢!

+1

因为它是[默认](https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_8004.htm#SQLRF54762)? –

+0

@LukeWoodward虽然这是默认值,但还是有一点。请参阅下面的答案。 –

回答

2

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

当Oracle和第三方工具创建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产生的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. 终结者

不同的DDL发电机允许您控制其中的一些选择,但以我的经验无他们让你完全控制他们。

+0

非常好,非常感谢! –

1

NOFORCE是默认值,所以保留它是多余的。

+0

是的,我也这么认为,但它也发生在“FORCE”,这不是默认设置。 –