CREATE TABLE hr.partitioned_table
(
  customer_id       NUMBER(5),
  item_id           NUMBER(5),
  transaction_date  DATE
)
PARTITION BY RANGE(transaction_date)
(
  PARTITION part_1 VALUES LESS THAN (TO_DATE('20120101', 'YYYYMMDD')),
  PARTITION part_2 VALUES LESS THAN (TO_DATE('20120201', 'YYYYMMDD')),
  PARTITION part_3 VALUES LESS THAN (TO_DATE('20120301', 'YYYYMMDD')),
  PARTITION part_4 VALUES LESS THAN (MAXVALUE)
);

INSERT INTO hr.partitioned_table VALUES 
  (1, 10, TO_DATE('20120101', 'YYYYMMDD'));
INSERT INTO hr.partitioned_table VALUES 
  (1, 10, TO_DATE('20120201', 'YYYYMMDD'));
INSERT INTO hr.partitioned_table VALUES 
  (1, 10, TO_DATE('20120301', 'YYYYMMDD'));
INSERT INTO hr.partitioned_table VALUES 
  (1, 10, TO_DATE('20120401', 'YYYYMMDD'));

SELECT DISTINCT tablespace_name
  FROM all_tab_partitions
 WHERE table_name = 'PARTITIONED_TABLE'
   AND table_owner  = 'HR';

ALTER TABLE (table_name)
 MOVE PARTITION (partition_name)
 TABLESPACE (tablespace_name);

CREATE OR REPLACE PROCEDURE move_partition(
  pSchema                VARCHAR2,
  pTableName             VARCHAR2,
  pDestinationTablespace VARCHAR2)
IS
/*--------------------------------------------------------------------------
--Creates a procedure that will move a partitioned table to a different     
--Tablespace.
----------------------------------------------------------------------------
--pSchema = Scheme the partitioned table is is
--pTableName = the name of the partitioned table
--pDestinationTablespace = The tablespace the partitioned table is going to 
--                         be moved to.                                   */
BEGIN

  -- FOR loop that loops through each partition of pTablename               
  FOR i IN (SELECT partition_name 
              FROM all_tab_partitions 
             WHERE table_name = pTableName)
  LOOP

  -- Moves the current partition to the desired tablespace                
  EXECUTE IMMEDIATE 'ALTER TABLE ' || pSchema || '.' || pTableName || 
                    ' MOVE PARTITION ' || i.partition_name || 
                    ' TABLESPACE ' || pDestinationTablespace;
  END LOOP;
END;
/

SELECT tablespace_name, COUNT(*)
  FROM all_tab_partitions
 WHERE table_name = 'PARTITIONED_TABLE'
   AND table_owner = 'HR'
 GROUP BY tablespace_name;

EXECUTE move_partition('HR', 'PARTITIONED_TABLE', 'EXAMPLE');

SELECT tablespace_name, COUNT(*)
  FROM all_tab_partitions
 WHERE table_name = 'PARTITIONED_TABLE'
   AND table_owner = 'HR'
 GROUP BY tablespace_name;

DROP TABLE hr.partitioned_table;