2010-11-12 8 views
5

J'ai une tâche monumentalement fastidieuse qui est de trouver plusieurs tables à partir d'un schéma énorme, et de générer le DDL pour ces tables.Comment générer par programme DDL à partir de la base de données Oracle?

Say, j'ai un schemaA a 1000 tables, je dois trouver si un tableA existait dans ce schemaA, si elle le fait, générer le DDL et enregistrez-le système de fichiers, si ne pas imprimer son nom sur ou écrivez-le dans un fichier. Des idées?

Répondre

16

Le package DBMS_METADATA (en supposant que vous utilisez une version raisonnablement récente d'Oracle) génère le DDL pour tout objet de la base de données. Donc

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

retournera un CLOB avec le DDL pour SchemaA.TableA. Vous pouvez attraper l'exception qui est levée que l'objet n'existe pas, mais je aurais tendance à penser que vous interrogez le dictionnaire de données (c.-à-DBA_OBJECTS) afin de vérifier qu'il ya une table nommée TableA en SchemaA, à savoir

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

Notez que si vous n'avez pas accès à DBA_OBJECTS, vous pouvez utiliser ALL_OBJECTS à la place. Le problème ici, cependant, est qu'il peut y avoir un TableA dans SchemaA sur lequel vous n'avez pas accès à SELECT. Cette table n'apparaîtrait pas dans ALL_OBJECTS (qui contient tous les objets auxquels vous avez accès) mais apparaîtrait dans DBA_OBJECTS (qui contient tous les objets de la base de données indépendamment de votre capacité à y accéder).

Vous pouvez ensuite écrire le DDL dans un fichier ou, si le nombre est 0, indiquer que l'objet n'existe pas. À partir d'une procédure stockée, vous pouvez utiliser le package UTL_FILE pour écrire dans un fichier sur le serveur de base de données. Si vous essayez d'écrire dans un fichier sur le système de fichiers client, vous devez utiliser une langue qui a accès aux ressources du système d'exploitation client. Un petit programme C/Java/Perl/etc devrait être en mesure de sélectionner un CLOB et écrire ces données dans un fichier sur le système d'exploitation client.

+0

Super, Justin, j'ai testé la première partie de votre sql fonctionne très bien, mais quand je cours la deuxième partie, j'ai un ORA-00942: la table ou la vue n'existe pas. Et comment puis-je écrire un clob dans un fichier en utilisant sql? – Sawyer

+0

@ZZcat - Mise à jour ma réponse –

+0

Minuscule omission - le premier exemple SQL a besoin d'une virgule entre 'TABLE' et 'TABLEA' sans laquelle il échoue. –

Questions connexes