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;