Oracle11g不能导出空表的三种解决方法

前端之家收集整理的这篇文章主要介绍了Oracle11g不能导出空表的三种解决方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Oracle导出表只会导出占用数据空间的数据,Oracle11g新增特性deferred_segment_creation,默认值为true,表示如果你创建表但是没往其插入数据,这个表是不会立即分配extent,即不占数据空间,表也不会分配segment,所以导致Oracle11g无法导出空表,具体表现在系统表user_tables中segment_created字段为"NO",(空表集合)。

select segment_created,table_name from user_tables where segment_created = 'NO';

以下提供三种解决方法

一、往空表中插入数据后再删除。(不推荐)

二、设置deferred_segment_creation参数为false,再查出空表集合,删除后重建。因为命令只作用于之后的数据表。(不推荐)

-- sql窗口执行效果
alter system set deferred_segment_creation = false;
-- 命令窗口查看效果
show parameter deferred_segment_creation;

三、使用ALLOCATE EXTENT,可以针对每张数据表/索引/视图等手工分配Extent(推荐)

其基本语法如下:

ALLOCATE EXTENT {SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer };

针对数据表语法如下:

-- 针对数据表完整语法
ALTER TABLE [schema.] table_name ALLOCATE EXTENT 
[({SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer })];
-- 针对数据表简单实例
alter table table_name allocate extent;

具体实现操作步骤:

1.查找当前用户所有空表,并构建命令语句,为了生成空表集合。

-- 查找所有空表sql
select table_name from user_tables where NUM_ROWS=0;
-- 构造所有空表的命令语句
select 'alter table' || table_name || 'allocate extent' from user_tables where 
NUM_ROWS=0 OR NUM_ROWS IS NULL;

效果图如下:

2.I.(针对含有PL/sql工具)可直接在PL/sql中在标题上全选复制,往命令窗口粘贴即可。

II.(若无PL/sql工具),可用文本写入如下sql脚本,然后通过cmd窗口进行操作,

-- 隐藏标题行、提示、结果返回行数,显示命令执行结果,具体参照:sqlplus命令大全。
set heading off;
set echo off;
set Feedback off;
set termout on;
spool E:\alter.sql;
Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null;
spool off;

同样得到结果后,再cmd执行生成文件后的代码即可。

本文参考:http://www.pinhuba.com/oracle/101128.htm

猜你在找的Oracle相关文章