批量迁移oracle表存储
场景:网友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中不可
相关新闻>>
- 发表评论
-
- 最新评论 更多>>