oracle批量循环执行sql,EXP-00003: 未找到段 (0,0) 的存储定义

本文讨论了在Oracle中遇到'EXP-00003: 未找到段 (0,0) 的存储定义'错误时,如何通过创建表时声明SEGMENT CREATION IMMEDIATE来立即创建Segment,确保所有表都有有效的存储定义。" 92695578,7556250,MyBatis高级映射详解,"['MyBatis', '数据库映射', 'ORM', '关系映射']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 exp导出表有警告,EXP-00003: 未找到段 (0,0) 的存储定。发现报错的都是带有表分区的表。
     搜索一下,有说索引是小写,有说表里没有数据的,有说执行alter system set deferred_segment_creation=false;
还有说执行 
alter table TabelName allocate extent 命令的。
     搜索
alter system set deferred_segment_creation=false; 该参数意思是当创建对象(如表),初始没有数据,是否立即创建segment。默认是true。这会导致在exp时,没有segment的对象不会导出。

但此命令只对以后的表有效,之前的表没有Segment的还是没有。可以创建表的时候声明立即创建Segment ,create table XXX (XXX  XXX) SEGMENT CREATION IMMEDIATE;

对于已经创建但是还没有Segment的表来说,可以执行alter table TabelName allocate extent来使其创建出Segment,当然也可以插入一条数据,使其创建Segment .
给所有表增加Segment,如下:

declare   

  -- Local variables here  
  i number;
  cou number;
  nam VARCHAR2 (200);
  strSQL VARCHAR2 (600);
begin  
  i:=0;  
  loop  
    i:=i+1;  
     strSQL:= 'select count(*) from user_tables';
    EXECUTE IMMEDIATE strSQL into cou ;
    strSQL:= 'select table_name from (select rownum as rown,table_name from user_tables) where rown =' || i;
    EXECUTE IMMEDIATE strSQL into nam ;
    strSQL:='alter table '|| nam ||' allocate extent'; 
     EXECUTE IMMEDIATE strSQL;
    commit; 
    if i>cou-1 then  
       exit;  
    end if;  
  end loop;  
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值