AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

以自动化方式编写 Oracle DDL

  • 772

Oracle SQL Developer 可以通过Tools -> Database Export...This 很好的导出DDL,但是需要人工干预。

我知道DBMS_METADATA.get_ddl(),但发现出口并不完美。我遇到了导出的DBMS_METADATADDL 无法使用的问题,如果没有首先修复关键字中间的中断等问题,甚至更糟。但是,如果有人知道一种DMBS_METADATA无需手动修复即可运行的导出 DDL 的方法,那也是一个很好的解决方案。

基本上,我正在寻找一种自动/可编写脚本的方式来导出与通过手动方式导出的内容相同的 DDL。

我怎样才能做到这一点?

oracle export
  • 4 4 个回答
  • 28143 Views

4 个回答

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

    您遇到问题的原因dbms_metadata.get_ddl是它输出CLOB的 s 大小可达 4GB。默认情况下,SQL*Plus 和 Oracle SQL Developer 会截断长文本,因此它们不会用大量文本破坏客户端。

    在 SQL*Plus 中使用一些命令很容易覆盖此行为SET并获得干净的 DDL。

    您需要的脚本是:

    -- 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

    好吧,如果 sqlplus 搞砸了您的 dbms_metadata.get_ddl 输出,为什么不选择 CLOB 中的输出并将 CLOB 写入文件系统。

    例如

    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;
    /
    

    这应该可以让您获得正确的 DDL,而不会导致输出混乱。唯一的事情是脚本将在数据库服务器上创建,而不是在您调用 sqlplus 的客户端上。

    该脚本保存在数据库服务器上的“DATA_PUPM_DIR”条目指向的目录中。IE

    select directory_path from all_directories where directory_name like 'DATA_PUMP_DIR';
    

    更重要的是,您可以在模式的所有表/索引等上添加某种迭代,并立即获得完整的模式 DDL。我一直都这样做。

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

    以下转换可能会有所帮助。我没有使用 DBMS_XSLPROCESSOR.CLOB2FILE 方法,但我确实使用这些方法将 Oracle 数据库从 Solaris 迁移到 Linux。由于他们使用的 Oracle 版本以及他们使用 XML 数据类型作为列数据类型的事实,我无法使用数据泵。

    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

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve