Эффективный способ получить DDL от всей базы данных Oracle - PullRequest
4 голосов
/ 15 июля 2011

В настоящее время в базе данных Oracle 11.1 имеется около 30 таблиц.

Есть ли способ сгенерировать все ddl одной командой?(Или несколько команд?)

Редактировать: Следуя предложенному ниже предложению, я попытался:

SELECT dbms_metadata.get_ddl( 'TABLE', table_name, owner )
  FROM all_tables;

И получил:

ORA-31603: object "HS_PARTITION_COL_NAME" of type TABLE not found in schema "SYS"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 3241
ORA-06512: at "SYS.DBMS_METADATA", line 4812
ORA-06512: at line 1
31603. 00000 -  "object \"%s\" of type %s not found in schema \"%s\""
*Cause:    The specified object was not found in the database.
*Action:   Correct the object specification and try the call again.

Понятно, что в dbms_metadata есть что-то чрезвычайно простое, чего я не понимаю.

Ответы [ 4 ]

4 голосов
/ 15 июля 2011

Вот что сработало для меня:

SELECT dbms_metadata.get_ddl('TABLE', table_name)
  FROM user_tables;

Если это как-то не так, пожалуйста, проголосуйте за меня.Я не очень разбираюсь в Oracle, поэтому не понимаю, почему ни один из ответов не дал просто работающий запрос.

3 голосов
/ 15 июля 2011

Вы можете использовать пакет DBMS_METADATA .Что-то вроде

SELECT dbms_metadata.get_ddl( 'TABLE', table_name, owner )
  FROM all_tables
 WHERE <<some condition to get the 30 tables in question>>
2 голосов
/ 15 июля 2011

Да, вы можете довольно легко использовать пакет dbms_metadata . Вы можете написать процедуру, которая открывает курсор на системную таблицу USER_TABLES и получает ddl для каждой таблицы. Пример тому есть и в статье.

0 голосов
/ 05 декабря 2014

Если вы хотите индивидуально генерировать ddl для каждого объекта,

Запросы:

--GENERATE DDL FOR ALL USER OBJECTS
--1. FOR ALL TABLES

SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) FROM USER_TABLES;

--2. FOR ALL INDEXES

SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME) FROM USER_INDEXES WHERE INDEX_TYPE ='NORMAL';

--3. FOR ALL VIEWS

SELECT DBMS_METADATA.GET_DDL('VIEW', VIEW_NAME) FROM USER_VIEWS;

OR

SELECT TEXT FROM USER_VIEWS

--4. FOR ALL MATERILIZED VIEWS

SELECT QUERY FROM USER_MVIEWS

--5. FOR ALL FUNCTION

SELECT DBMS_METADATA.GET_DDL('FUNCTION', OBJECT_NAME) FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION'

GET_DDL Функция не поддерживает некоторые object_type, такие как LOB, МАТЕРИАЛИЗИРОВАННЫЙ ВИД, СТОЛОВОЕ РАЗДЕЛЕНИЕ

SO, Консолидированный запрос для генерации DDL будет:

SELECT OBJECT_TYPE, OBJECT_NAME,DBMS_METADATA.GET_DDL(OBJECT_TYPE, OBJECT_NAME, OWNER) FROM ALL_OBJECTS WHERE (OWNER = 'XYZ') AND OBJECT_TYPE NOT IN('LOB','MATERIALIZED VIEW', 'TABLE PARTITION') ORDER BY OBJECT_TYPE, OBJECT_NAME;
...