2010-11-12 30 views
5

Tengo una tarea monumentalmente tediosa que consiste en encontrar varias tablas de un gran esquema y generar el DDL para estas tablas.¿Cómo generar programáticamente DDL desde la base de datos Oracle?

Say, tengo una schemaA tiene 1000 tablas, necesito encontrar si existía una tableA en este schemaA, si lo hace, generar el DDL y guardarlo en sistemas de ficheros, si no, imprima su nombre a cabo o escríbelo en un archivo. ¿Algunas ideas?

Respuesta

16

El paquete DBMS_METADATA (suponiendo que se encuentre en una versión razonablemente reciente de Oracle) generará el DDL para cualquier objeto en la base de datos. Entonces

SELECT dbms_metadata.get_ddl('TABLE', 'TABLEA', 'SCHEMAA') 
    FROM dual; 

devolverá un CLOB con el DDL para SchemaA.TableA. Se puede coger la excepción que se produce que el objeto no existe, pero yo tendería a sugerir que se consulta el diccionario de datos (es decir DBA_OBJECTS) para verificar que existe una tabla llamada TableA en SchemaA, es decir

SELECT COUNT(*) 
    FROM dba_objects 
WHERE owner = 'SCHEMAA' 
    AND object_name = 'TABLEA' 
    AND object_type = 'TABLE' 

Tenga en cuenta que si no tiene acceso a DBA_OBJECTS, puede usar ALL_OBJECTS en su lugar. La preocupación allí, sin embargo, es que puede haber una Tabla A en SchemaA en la que no tiene acceso SELECCIONADO. Esa tabla no aparecería en ALL_OBJECTS (que tiene todos los objetos a los que tiene acceso) pero aparecería en DBA_OBJECTS (que tiene todos los objetos en la base de datos, independientemente de su capacidad para acceder a ellos).

Puede escribir el DDL en un archivo o, si el recuento es 0, indicar que el objeto no existe. Desde un procedimiento almacenado, puede usar el paquete UTL_FILE para escribir en un archivo en el servidor de la base de datos. Si intenta escribir en un archivo en el sistema de archivos del cliente, deberá usar un idioma que tenga acceso a los recursos del sistema operativo del cliente. Un pequeño programa C/Java/Perl/etc. debería poder seleccionar un CLOB y escribir esos datos en un archivo en el sistema operativo del cliente.

+0

Genial, Justin, he probado que la primera parte de tu sql funciona muy bien, pero cuando ejecuto la segunda parte, obtuve una ORA-00942: la tabla o vista no existe. ¿Y cómo puedo escribir un clob en un archivo usando sql? – Sawyer

+0

@ZZcat - Actualicé mi respuesta –

+0

Omisin minúscula: la primera muestra de SQL necesita una coma entre 'TABLE' y 'TABLEA' sin la cual falla. –

Cuestiones relacionadas