`
53873039oycg
  • 浏览: 844058 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

使用dbms_detadata.get_ddl导出表结构

 
阅读更多

     今天在测试怎样导出用户的视图时候,使用了dbms_metadata.get_ddl,特此记录,首先带上参考的链接:

    

http://blog.itpub.net/498744/viewspace-277830/
http://blog.sina.com.cn/s/blog_4f86237e010081td.html
http://www.astral-consultancy.co.uk/cgi-bin/hunbug/doco.cgi?11070

    一开始我使用itpub一文中使用的脚本(他的脚本中要求表名大写,我修改了):

   

create or replace procedure proc_dbmsddl_singleobject(p_type varchar2,p_name varchar2,p_filename varchar2) is
begin
  declare
    l_file           utl_file.file_type;
    l_buffer       varchar2(100);
    l_amount    binary_integer := 100;
    l_pos          integer := 1;
    l_clob         clob;
    l_clob_len  integer;
  begin
    select dbms_metadata.get_ddl(upper(p_type),upper(p_name))||';' into l_clob from dual;
    l_clob_len := dbms_lob.getlength(l_clob);
    l_file := utl_file.fopen('ORADIR_F_DIR', p_filename||'.sql', 'a', 2000);  
    while l_pos < l_clob_len loop
      dbms_lob.read(l_clob, l_amount, l_pos, l_buffer);
      utl_file.put_line(l_file, l_buffer);
      l_pos := l_pos + l_amount;
    end loop;
    utl_file.fclose(l_file);
  end;
end proc_dbmsddl_singleobject;

   

create or replace procedure proc_exportddl_allobject(p_filename varchar2) is
begin
  for x in (select table_name from user_tables) loop
       proc_dbmsddl_singleobject('TABLE',x.table_name,p_filename);
  end loop;
/*  for x in (select index_name from user_indexes) loop
       proc_exportddl_singleobject('INDEX',x.index_name,p_filename);
  end loop;
  for x in (select view_name from user_views) loop
       proc_exportddl_singleobject('VIEW',x.view_name,p_filename);
  end loop;
  for x in (select synonym_name from user_synonyms) loop
       proc_exportddl_singleobject('SYNONYM',x.synonym_name,p_filename);
  end loop;*/
end proc_exportddl_allobject;

    为什么我要把上面导view的注释掉呢,因为我只有3个视图,测试没什么意思,表很多,就拿导出表结构测试,测试结果是:

   

    ora-06502 pl/sql 数字或值错误 字符串缓冲区太小,一看就是分配的100太小了,改成1000测试,导出成功,导出数据有44K。

    继续使用另一个脚本测试下:

   

set pagesize 0
set long 90000
set feedback off
set echo off
spool f:/saveFile/oracle/tmd_table.sql
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;
spool off;

    导出结果是44k。

    那把1000改大写试下或者把pl/sql脚本中的90000改小点结果怎样呢:

   

create or replace procedure proc_exportddl_singleobject(p_type varchar2,p_name varchar2,p_filename varchar2) is
begin
  declare
    l_file          utl_file.file_type;
    l_buffer        varchar2(32767);
    l_amount        binary_integer := 32767;
    l_pos          integer := 1;
    l_clob         clob;
    l_clob_len  integer;
  begin
    select dbms_metadata.get_ddl(upper(p_type),upper(p_name))||';' into l_clob from dual;
    l_clob_len := dbms_lob.getlength(l_clob);
    l_file := utl_file.fopen('ORADIR_F_DIR', p_filename||'.sql', 'a', 32767);  
    while l_pos < l_clob_len loop
      dbms_lob.read(l_clob, l_amount, l_pos, l_buffer);
      utl_file.put_line(l_file, l_buffer);
      l_pos := l_pos + l_amount;
    end loop;
    utl_file.fclose(l_file);
  end;
end proc_exportddl_singleobject;

    改成了32767,结果是44k,和上面的44k比对结果

   

     可以看出使用spool导出的结果没有逗号。

     把spool脚本中的90000改小点试下:

    

set pagesize 0
set long 1000
set feedback off
set echo off
spool f:/saveFile/oracle/tmd_table_1000.sql
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;
spool off;

    结果是42k,变小了,把1000去掉:

   

set pagesize 0
set feedback off
set echo off
spool f:/saveFile/oracle/tmd_table_no.sql
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;
spool off;

    结果也是42k,比对下44k和42k的结果:

   

   可以看出42k数据中明显少了数据,44k结果才是正确的。

   这里说明下long参数的意义:

  

long:数据类型用于定义变长字符串,类似于VARCHAR2数据类型,但其字符串的最大长度为32760字节

    所以,在直接使用spool保存查询结果时候,建议把long设置大一些。

    这里可以看出导出的表结构不是我们想要的那种很简单的create语句,里面有storage信息,如何导出表的create语句或者insert语句,我会在下篇博客分享,谢谢。

    全文完。

    

 

  • 大小: 126 KB
  • 大小: 218.1 KB
  • 大小: 405.9 KB
  • 大小: 462.3 KB
1
0
分享到:
评论

相关推荐

    [Oracle] dbms_metadata.get_ddl 的使用方法总结

    下面我们将深入探讨`dbms_metadata.get_ddl`的使用方法。 1. 获取对象的DDL `dbms_metadata.get_ddl`的基本语法如下: ```sql DBMS_METADATA.GET_DDL(object_type, object_name, schema) ``` - `object_type`:...

    DBMS_STATS.GATHER_TABLE_STATS详解.pdf

    1. **结构验证限制**:`DBMS_STATS` 不支持结构验证(`Validate Structure`)功能,这意味着它无法验证表结构的完整性。 2. **资源消耗**:并行分析虽然可以提高速度,但可能会消耗更多的系统资源。 综上所述,`DBMS_...

    DBMS_RANDOM.VALUE OR DBMS_RANDOM.STRING

    在Oracle数据库系统中,`DBMS_RANDOM`是一个非常实用的包,它提供了生成随机数和随机字符串的功能。这个包在各种场景下都有广泛的应用,比如在测试数据的生成、模拟随机行为或者创建伪随机数据时。我们将深入探讨`...

    使用dbms_stats包手工收集统计信息

    Oracle 数据库中使用 dbms_stats 包手动收集统计信息 在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息...

    oracle dbms_lob

    总之,`DBMS_LOB`是Oracle数据库管理LOB数据的关键工具,对于处理大量非结构化数据的开发者来说,理解和熟练使用这个包是必不可少的技能。通过深入学习和实践,可以有效地利用Oracle的LOB功能满足大数据存储和处理的...

    DBMS_SQL.rar_dbms_oracle

    在Oracle数据库系统中,DBMS_SQL是一个非常重要的包,它提供了动态执行SQL语句的功能,这对于开发复杂的数据库应用或者需要在运行时构建SQL语句的情况非常有用。DBMS_SQL允许我们处理那些在编译时未知的SQL语句,极...

    Oracle 18c bug 执行 DBMS_PDB.CHECK_PLUG_COMPATIBILITY报错_ITPUB博客.mhtml

    Oracle 18c bug 执行 DBMS_PDB.CHECK_PLUG_COMPATIBILITY报错_ITPUB博客.mhtml

    dbms_comp_advisor.getratio 预估压缩比例的存储过程脚本

    `dbms_comp_advisor.getratio`存储过程是Oracle数据库压缩顾问(Compression Advisor)的一部分,它的主要功能是分析表或分区的数据,估算在应用不同类型的压缩算法后,数据占用的空间会减少多少。这对于决定是否...

    怎样禁用及回收java的授权dbms_java

    ### 如何禁用及回收Java的授权:dbms_java 授权管理详解 #### 一、引言 在Oracle数据库环境中,`dbms_java`包提供了一系列功能强大的工具,用于管理和控制Java应用程序的安全性。这对于那些在Oracle环境中部署了...

    PostgreSQL_DBMS_for_Windows_922_136133.exe

    支持ArcGIS10.2版本的PostgreSQL_DBMS_for_windows_922,ESRI官方原版资源。

    DBMS_SQL的使用

    ### Oracle DBMS_SQL 使用详解 #### 一、概述 在Oracle数据库中,`DBMS_SQL`包是一个功能强大的工具,用于执行动态SQL语句。它提供了处理动态SQL语句的能力,使得开发人员能够灵活地构建和执行SQL语句,而不需要...

    DBMS_XMLDOM DBMS_XMLPARSER DBMS_XMLQUERY 文档

    例如,你可以使用DBMS_XMLDOM.newDoc()来创建一个新的XML文档对象,使用DBMS_XMLDOM.parseXML()将XML字符串解析成DOM树,然后通过DBMS_XMLDOM.getElementsByTagName()等方法对DOM树进行查询和操作。 DBMS_XMLPARSER...

    从 Oracle数据库中导出SQL脚本.doc

    该语法使用 `dbms_metadata.get_ddl` 函数来获取指定表和索引的 DDL 定义,其中 `dbms_metadata.get_ddl` 函数的三个参数分别是对象类型、对象名和用户名。在上面的例子中,第一个参数是 `TABLE`,表示获取表的 DDL ...

    oralce异常信息对照表

    "oralce异常信息对照表" 提供了一个有价值的资源,帮助开发者和DBA理解并解决Oracle数据库中遇到的各种异常。这个对照表通常包含了异常代码、异常名称、异常描述以及可能的解决方案。 Oracle异常主要分为预定义异常...

    dbms_obfuscation_toolkit加密解密数据

    ### DBMS_OBFUSCATION_TOOLKIT:Oracle 数据库中的加密与解密工具包 DBMS_OBFUSCATION_TOOLKIT是Oracle数据库提供的一种用于数据加密解密的强大工具包,自Oracle 8i版本开始引入。它支持多种加密算法,如DES、...

    oracle数据库定时任务dbms_job的用法详解

    使用DBMS_JOB.SUBMIT函数创建一个新的定时任务。该函数需要提供一个变量来接收任务编号(jobno),存储过程名称(your_procedure),以及任务的下次执行时间和间隔。例如: ```sql VARIABLE jobno NUMBER; BEGIN...

    GBase 8t/8s/informix获取DDL函数DBMS-METADATA.GET-DDL

    GBase 8t/8s/informix获取DDL函数DBMS_METADATA.GET_DDL CREATE FUNCTION DBMS_METADATA.GET_DDL( object_type varchar(16) , name varchar(128), schema varchar(32) default null, v_version varchar(32) ...

    Oracle常用查看表结构命令

    使用`DBMS_METADATA`包可以查看表结构,例如: ```sql BEGIN DBMS_METADATA.GET_TABLE/DDLS('USER_TABLES', 'TABLE_NAME'); END; ``` 这条语句将返回当前用户所有表的结构信息,包括表名、表空间名、最后分析时间等...

    DBMS_c.rar_C语言实现DBMS_DBMS_c_c语言DBMS_dbms

    2. **数据结构**:为了高效存储和检索数据,开发者可能使用了链表、数组、哈希表或B树等数据结构。例如,B树用于索引,以快速定位数据。 3. **查询解析**:解析 SQL 查询语句是DBMS的重要功能。C程序需要能够识别并...

Global site tag (gtag.js) - Google Analytics