加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 15:09:15 所属栏目:百科 来源:网络整理
导读:Oracle导出表只会导出占用数据空间的数据,Oracle11g新增特性deferred_segment_creation,默认值为true,表示如果你创建表但是没往其插入数据,这个表是不会立即分配extent,即不占数据空间,表也不会分配segment,所以导致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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读