AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 8392
Accepted
MatthewToday
MatthewToday
Asked: 2011-11-25 19:13:05 +0800 CST2011-11-25 19:13:05 +0800 CST 2011-11-25 19:13:05 +0800 CST

Crie scripts do Oracle DDL de maneira automatizada

  • 772

O Oracle SQL Developer é capaz de exportar DDL por meio de Tools -> Database Export...Isso funciona muito bem, mas requer intervenção manual.

Conheço DBMS_METADATA.get_ddl(), mas descobri que a exportação não é perfeita. Encontrei problemas em que o DDL exportado DBMS_METADATAnão era utilizável sem primeiro corrigir problemas como quebras no meio de uma palavra-chave e coisas piores. No entanto, se alguém souber uma maneira de exportar DDL DMBS_METADATAque possa ser executado sem correções manuais, também seria uma ótima solução.

Basicamente, estou procurando uma maneira automática/scriptável de exportar DDL idêntica ao que é exportado pela maneira manual.

Como eu posso fazer isso?

oracle export
  • 4 4 respostas
  • 28143 Views

4 respostas

  • Voted
  1. Nick Chammas
    2012-06-20T08:01:41+08:002012-06-20T08:01:41+08:00

    O motivo pelo qual você está tendo problemas dbms_metadata.get_ddlé que ele gera CLOBs que podem ter até 4 GB de tamanho. Por padrão, o SQL*Plus e o Oracle SQL Developer truncam o texto longo para que não destruam o cliente com grandes quantidades de texto.

    É muito fácil substituir esse comportamento no SQL*Plus com alguns SETcomandos e obter um DDL limpo.

    O script que você precisa é:

    -- Run this script in SQL*Plus.
    
    -- don't print headers or other crap
    set heading off;
    set echo off;
    set pagesize 0;      
    
    -- don't truncate the line output
    -- trim the extra space from linesize when spooling
    set long 99999;      
    set linesize 32767;  
    set trimspool on;    
    
    -- don't truncate this specific column's output
    col object_ddl format A32000;
    
    spool sys_ddl.sql;
    
    SELECT dbms_metadata.get_ddl(object_type, object_name, owner) || ';' AS object_ddl
    FROM DBA_OBJECTS
    WHERE 
          OWNER = 'SYS'
      AND OBJECT_TYPE IN (
          'TABLE'
        , 'INDEX'
        , 'SEQUENCE'
        , 'VIEW'
      )
    ORDER BY
        OWNER
      , OBJECT_TYPE
      , OBJECT_NAME
    ;
    
    spool off;
    
    • 7
  2. Best Answer
    user5294
    2011-12-23T12:01:24+08:002011-12-23T12:01:24+08:00

    Bem, se o sqlplus está estragando sua saída dbms_metadata.get_ddl, por que não selecionar a saída em um CLOB e gravar o CLOB no sistema de arquivos.

    por exemplo

    DECLARE
        data CLOB;
        objType varchar2(30) := 'TABLE';
        objSchema varchar2(30) := 'SCOTT';
        objName varchar2(30) := 'EMP';
        fname varchar2(256) := objType || '_' || objSchema || '_' || objName || '.sql';
    BEGIN
        SELECT dbms_metadata.get_ddl(objType,objName,objSchema) into data from dual;
        DBMS_XSLPROCESSOR.CLOB2FILE(data,'DATA_PUMP_DIR',fname);
    END;
    /
    

    Isso deve fazer com que você corrija o DDL, sem a saída ficar confusa. A única coisa é que o script será criado no servidor DB e não no cliente de onde você invoca o sqlplus.

    O script é salvo no diretório apontado pela entrada 'DATA_PUPM_DIR' no servidor de banco de dados. ou seja

    select directory_path from all_directories where directory_name like 'DATA_PUMP_DIR';
    

    Além disso, você pode adicionar algum tipo de iteração sobre todas as tabelas/índices etc de um esquema e obter o DDL de um esquema completo rapidamente. Eu faço isso o tempo todo.

    • 5
  3. Gandolf989
    2015-06-17T06:04:13+08:002015-06-17T06:04:13+08:00

    As seguintes transformações podem ajudar. Não usei o método DBMS_XSLPROCESSOR.CLOB2FILE, mas usei-o para migrar um banco de dados Oracle do Solaris para o Linux. Não pude usar o data pump por causa da versão do Oracle que eles estavam usando e pelo fato de usarem tipos de dados XML para tipos de dados de coluna.

    DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY',             TRUE );
    DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR',      TRUE );
    DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',    FALSE);
    DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'OID',                FALSE);
    DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
    DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE',         TRUE );
    
    • 0
  4. user222704
    2021-01-27T03:44:06+08:002021-01-27T03:44:06+08:00
    set heading off feedback off trimspool on escape off
    set long 1000 linesize 1000 pagesize 0
    
    col SEQDDL format A300
    
    spool tts_create_seq.sql
    
    prompt /* ========================= */
    
    prompt /* Drop and create sequences */
    
    prompt /* ========================= */
    
    select regexp_replace(
     dbms_metadata.get_ddl('SEQUENCE',sequence_name,sequence_owner),
     '^.*(CREATE SEQUENCE.*CYCLE).*$')||';' SEQDDL
     from dba_sequences
     where sequence_owner not in
     (select name
     from system.logstdby$skip_support
     where action=0);
    
    spool off
    
    • -1

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve