Move Objects To Another Tablespace

Moving an object to another schema might be a tiring activity especially if you need to move multiple objects at once and keep all settings the same.

DECLARE
  v_curr_tbs VARCHAR2(50);
  v_dest_tbs VARCHAR2(50);
  v_sql VARCHAR2(1000);
  
  -- separator definition
  v_rpad_len INT;
  v_rpad_sep CHAR;
  
  -- debug mode setting
  v_debug SMALLINT;
  
BEGIN
  v_curr_tbs := 'YOUR_ACTUAL_TABLESPACE';
  v_dest_tbs := 'YOUR_NEW_TABLESPACE';

  v_rpad_len INT := 50; 
  v_rpad_sep CHAR(1) := '-'; 

  v_debug SMALLINT := 1; -- 1 = print only; 0 = print and execute

  
  -- get the unique list of users / schemas / owners

  FOR list_owner IN (SELECT DISTINCT owner
                     FROM dba_segments
                     WHERE 1=1
                     AND owner IN ('OWNER1','OWNER2')
                     AND tablespace_name = v_curr_tbs)
  LOOP

  -- migrate
  
        dbms_output.put_line('TABLES:');
        dbms_output.put_line(rpad('',v_rpad_len, v_rep_sep);
        
              FOR list_tables IN (SELECT table_name
                                        ,iot_name
                                  FROM dba_tables
                                  WHERE owner = list_owner.owner
                                  AND tablespace_name = v_curr_tbs)
              LOOP
                IF list_tables.iot_name IS NOT NULL THEN
                  v_sql := 'ALTER TABLE "' || list_owner.owner || '"."' || list_tables.iot_name || '" MOVE TABLESPACE ' || v_dest_tbs;
                  dbms_output.put_line(v_sql);
                  
                    IF debug = 0 THEN EXECUTE IMMEDIATE v_sql END;
                    
                ELSE
                  v_sql := 'ALTER TABLE "' || list_owner.owner || '"."' || list_tables.table_name || '" MOVE TABLESPACE ' || v_dest_tbs;
                  dbms_output.put_line(v_sql);
                  
                    IF debug = 0 THEN EXECUTE IMMEDIATE v_sql END;
                    
                END IF;
              END LOOP;
            
        dbms_output.put_line(' ');
        dbms_output.put_line('LOBS:');
        dbms_output.put_line(rpad('',v_rpad_len, v_rep_sep);
  
              FOR list_lobs IN (SELECT table_name
                                      ,column_name
                                FROM dba_lobs
                                WHERE owner = list_owner.owner
                                AND tablespace_name = v_curr_tbs)
              LOOP
                v_sql := 'ALTER TABLE ' || list_owner.owner || '.' || list_lobs.table_name || ' MOVE LOB(' || list_lobs.column_name || ') STORE AS (TABLESPACE ' || v_dest_tbs|| ')';
                  dbms_output.put_line(v_sql);
                  
                    IF debug = 0 THEN EXECUTE IMMEDIATE v_sql END;
                    
              END LOOP;
  
        dbms_output.put_line(' ');
        dbms_output.put_line('INDEXES:');
        dbms_output.put_line(rpad('',v_rpad_len, v_rep_sep);
  
              FOR list_indexes IN (SELECT segment_name
                                         ,segment_type
                                   FROM dba_segments
                                   WHERE owner = list_owner.owner
                                   AND tablespace_name = v_curr_tbs
                                   AND segment_type = 'INDEX')
              LOOP
                 v_sql := 'ALTER INDEX ' || list_owner.owner || '."' || list_indexes.segment_name || '" REBUILD TABLESPACE ' || v_dest_tbs;
                 dbms_output.put_line(v_sql);
                  
                    IF debug = 0 THEN EXECUTE IMMEDIATE v_sql END;
                    
              END LOOP;
                
  END LOOP;
END;
/