今天在测试怎样导出用户的视图时候,使用了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语句,我会在下篇博客分享,谢谢。
全文完。
相关推荐
下面我们将深入探讨`dbms_metadata.get_ddl`的使用方法。 1. 获取对象的DDL `dbms_metadata.get_ddl`的基本语法如下: ```sql DBMS_METADATA.GET_DDL(object_type, object_name, schema) ``` - `object_type`:...
1. **结构验证限制**:`DBMS_STATS` 不支持结构验证(`Validate Structure`)功能,这意味着它无法验证表结构的完整性。 2. **资源消耗**:并行分析虽然可以提高速度,但可能会消耗更多的系统资源。 综上所述,`DBMS_...
在Oracle数据库系统中,`DBMS_RANDOM`是一个非常实用的包,它提供了生成随机数和随机字符串的功能。这个包在各种场景下都有广泛的应用,比如在测试数据的生成、模拟随机行为或者创建伪随机数据时。我们将深入探讨`...
Oracle 数据库中使用 dbms_stats 包手动收集统计信息 在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息...
总之,`DBMS_LOB`是Oracle数据库管理LOB数据的关键工具,对于处理大量非结构化数据的开发者来说,理解和熟练使用这个包是必不可少的技能。通过深入学习和实践,可以有效地利用Oracle的LOB功能满足大数据存储和处理的...
在Oracle数据库系统中,DBMS_SQL是一个非常重要的包,它提供了动态执行SQL语句的功能,这对于开发复杂的数据库应用或者需要在运行时构建SQL语句的情况非常有用。DBMS_SQL允许我们处理那些在编译时未知的SQL语句,极...
Oracle 18c bug 执行 DBMS_PDB.CHECK_PLUG_COMPATIBILITY报错_ITPUB博客.mhtml
`dbms_comp_advisor.getratio`存储过程是Oracle数据库压缩顾问(Compression Advisor)的一部分,它的主要功能是分析表或分区的数据,估算在应用不同类型的压缩算法后,数据占用的空间会减少多少。这对于决定是否...
### 如何禁用及回收Java的授权:dbms_java 授权管理详解 #### 一、引言 在Oracle数据库环境中,`dbms_java`包提供了一系列功能强大的工具,用于管理和控制Java应用程序的安全性。这对于那些在Oracle环境中部署了...
支持ArcGIS10.2版本的PostgreSQL_DBMS_for_windows_922,ESRI官方原版资源。
### Oracle DBMS_SQL 使用详解 #### 一、概述 在Oracle数据库中,`DBMS_SQL`包是一个功能强大的工具,用于执行动态SQL语句。它提供了处理动态SQL语句的能力,使得开发人员能够灵活地构建和执行SQL语句,而不需要...
例如,你可以使用DBMS_XMLDOM.newDoc()来创建一个新的XML文档对象,使用DBMS_XMLDOM.parseXML()将XML字符串解析成DOM树,然后通过DBMS_XMLDOM.getElementsByTagName()等方法对DOM树进行查询和操作。 DBMS_XMLPARSER...
该语法使用 `dbms_metadata.get_ddl` 函数来获取指定表和索引的 DDL 定义,其中 `dbms_metadata.get_ddl` 函数的三个参数分别是对象类型、对象名和用户名。在上面的例子中,第一个参数是 `TABLE`,表示获取表的 DDL ...
"oralce异常信息对照表" 提供了一个有价值的资源,帮助开发者和DBA理解并解决Oracle数据库中遇到的各种异常。这个对照表通常包含了异常代码、异常名称、异常描述以及可能的解决方案。 Oracle异常主要分为预定义异常...
### DBMS_OBFUSCATION_TOOLKIT:Oracle 数据库中的加密与解密工具包 DBMS_OBFUSCATION_TOOLKIT是Oracle数据库提供的一种用于数据加密解密的强大工具包,自Oracle 8i版本开始引入。它支持多种加密算法,如DES、...
使用DBMS_JOB.SUBMIT函数创建一个新的定时任务。该函数需要提供一个变量来接收任务编号(jobno),存储过程名称(your_procedure),以及任务的下次执行时间和间隔。例如: ```sql VARIABLE jobno NUMBER; BEGIN...
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) ...
使用`DBMS_METADATA`包可以查看表结构,例如: ```sql BEGIN DBMS_METADATA.GET_TABLE/DDLS('USER_TABLES', 'TABLE_NAME'); END; ``` 这条语句将返回当前用户所有表的结构信息,包括表名、表空间名、最后分析时间等...
2. **数据结构**:为了高效存储和检索数据,开发者可能使用了链表、数组、哈希表或B树等数据结构。例如,B树用于索引,以快速定位数据。 3. **查询解析**:解析 SQL 查询语句是DBMS的重要功能。C程序需要能够识别并...