Как программно генерировать DDL из базы данных Oracle?
У меня сложная задача - найти несколько таблиц из огромной схемы и сгенерировать DDL для этих таблиц.
Скажи, у меня есть schemaA
имеет 1000 таблиц, мне нужно найти, если tableA
существовал в этом schemaA
если это так, сгенерируйте DDL и сохраните его в файловой системе, если нет, напечатайте его имя или запишите его в файл. Есть идеи?
1 ответ
Пакет DBMS_METADATA (при условии, что вы используете достаточно свежую версию Oracle) сгенерирует DDL для любого объекта в базе данных. Так
SELECT dbms_metadata.get_ddl( 'TABLE', 'TABLEA', 'SCHEMAA' )
FROM dual;
вернет CLOB с DDL для SchemaA.TableA. Вы можете поймать исключение, которое выдается, что объект не существует, но я бы посоветовал вам сделать запрос к словарю данных (например, DBA_OBJECTS), чтобы убедиться, что в SchemaA есть таблица с именем TableA, т.е.
SELECT COUNT(*)
FROM dba_objects
WHERE owner = 'SCHEMAA'
AND object_name = 'TABLEA'
AND object_type = 'TABLE'
Обратите внимание, что если у вас нет доступа к DBA_OBJECTS, вы можете вместо этого использовать ALL_OBJECTS. Однако проблема заключается в том, что в SchemaA может существовать таблица A, к которой у вас нет доступа SELECT. Эта таблица не будет отображаться в ALL_OBJECTS (в которой есть все объекты, к которым у вас есть доступ), но будет отображаться в DBA_OBJECTS (в которой есть все объекты в базе данных, независимо от вашей возможности доступа к ним).
Затем вы можете либо записать DDL в файл, либо, если счетчик равен 0, указать, что объект не существует. Из хранимой процедуры вы можете использовать пакет UTL_FILE для записи в файл на сервере базы данных. Если вы пытаетесь записать файл в файловой системе клиента, вам нужно будет использовать язык, который имеет доступ к ресурсам операционной системы клиента. Небольшая программа на C/ Java/ Perl/ и т.д. должна иметь возможность выбирать CLOB и записывать эти данные в файл в операционной системе клиента.