批量迁移oracle表存储

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 19:49 点击:

场景:网友marine遇到问题,要求将某用户的表从表空间A移动到表空间B,用户表的个数在1000+以上
分析1:首先可以确定的是针对用户单张表移动表空间使用alter table table_name remove tablespace tablespace_name这种DDL语句实现;
其次需要查dba_tables视图找出改用户在A表空间上的表名称,然后将值保存为变量传递给for循环;
最后执行动态SQL,在PL/SQL中不可能直接执行DDL语句,因而需要使用execute immediate的方式执行动态SQL;
  
分析2:当然也可以去拼凑一个sql脚本,然后执行脚本达到这个效果,但执行效率肯定不如前者

SQL> set echo off  SQL> set feedback off  SQL> set heading off  SQL> spool /home/oracle/move.sql  SQL> select 'alter table hr.' ||table_name || ' move tablespace TBS_APPLE ;'    2  from dba_tables where owner='HR' and tablespace_name='EXAMPLE';      [oracle@orcl ~]$ cat move.sql   alter table hr.REGIONS move tablespace TBS_APPLE ;                                alter table hr.LOCATIONS move tablespace TBS_APPLE ;                              alter table hr.DEPARTMENTS move tablespace TBS_APPLE ;                            alter table hr.JOBS move tablespace TBS_APPLE ;                                   alter table hr.EMPLOYEES move tablespace TBS_APPLE ;                              alter table hr.JOB_HISTORY move tablespace TBS_APPLE ;  模拟相关场景  
步骤一:新建表空间,查出用户所拥有的在A表空间上的表,这里的用户以HR为例,表空间以example为例

SQL> create tablespace tbs_apple datafile '/u01/app/oracle/oradata/orcl/tbs_apple01.dbf'      2 size 10M autoextend on next  10M maxsize 1G      3 extent management local segment space management auto;   SQL> select table_name from dba_tables where owner='HR' and tablespace_name='EXAMPLE';  TABLE_NAME  ------------------------------  REGIONS  LOCATIONS  DEPARTMENTS  JOBS  EMPLOYEES  JOB_HISTORY  6 rows selected. 步骤二:使用变量实现

SQL> declare    2  v_1 varchar2(200);    3  begin    4     select table_name into v_1 from dba_tables where owner='HR' and tablespace_name='EXAMPLE';    5       begin    6         for i in v_1    7         loop    8           execute immediate 'alter table  hr.'||v_1 || ' move tablespace example';    9         end loop;   10       end;   11  end;     12  /         for i in v_1                  *  ERROR at line 6:  ORA-06550: line 6, column 17:  PLS-00456: item 'V_1' is not a cursor  ORA-06550: line 6, column 8:  PL/SQL: Statement ignored 以上报错,说明在PL/SQL中不可

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Table函数使用简介
      • Oracle数据库Constraint约束的常用操作及异常处理
      • Bulk Collect性能分析(zz)
      • export/import的使用
      • OCP043第十五讲 Database Security
      • ORACLE10gr2数据导入MySQL方案
      • oracle 让sys用户可以使用isqlplus
      • 在oracle数据库下使用iSQL*Plus DBA访问数据库
      • Oracle行列转换小结
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1