Когда я открываю источник View, пункт "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 Navigator), я получаю следующее:

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

Псевдоним (first_name, age) опущен, потому что они равны столбцам подзапроса.

Но можете ли вы сказать мне, почему пункт NOFORCE тоже не показали?

Спасибо!!

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, Но DDL генерируется DBMS_METADATA.GET_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:

  1. OR REPLACE
  2. FORCE|NOFORCE
  3. AND RESOLVE|AND COMPILE (для Java)
  4. Пробелы
  5. случай
  6. Списки столбцов
  7. Двойные кавычки
  8. Терминаторы

Различные генераторы DDL позволяют вам управлять некоторыми из этих опций, но, по моему опыту, ни один из них не позволяет вам полностью контролировать все из них.

NOFORCE по умолчанию, поэтому его сохранение является избыточным.

Другие вопросы по тегам