해시 파티션과 시스템 파티션은 직접 파티션명을 지정하지 않거나 SUBPARTITION TEMPLATE을 정의하지 않으면 파티션명이 자동으로 생성됩니다. 자동으로 생성된 파티션명은 PARTITION 절에서 사용하기에 불편합니다.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 NUMBER)
PARTITION BY HASH (c1) SUBPARTITION BY HASH (c2) SUBPARTITIONS 2 PARTITIONS 2;
해시 파티션과 시스템 파티션은 기본적으로 접두어가 SYS_P인 파티션명으로 생성됩니다.
-- 2-1
SELECT partition_name, partition_position
FROM user_tab_partitions
WHERE table_name = 'T1';
PARTITION_NAME PARTITION_POSITION
-------------- ------------------
SYS_P54825 1
SYS_P54826 2
2 행이 선택되었습니다.
-- 2-2
SELECT partition_name, subpartition_name, partition_position, subpartition_position
FROM user_tab_subpartitions
WHERE table_name = 'T1';
PARTITION_NAME SUBPARTITION_NAME PARTITION_POSITION SUBPARTITION_POSITION
-------------- ----------------- ------------------ ---------------------
SYS_P54825 SYS_SUBP54821 1 1
SYS_P54825 SYS_SUBP54822 1 2
SYS_P54826 SYS_SUBP54823 2 1
SYS_P54826 SYS_SUBP54824 2 2
4 행이 선택되었습니다.
아래와 같이 파티션명을 변경하는 prc_rename_partition 프로시저를 생성하겠습니다.
-- 3
CREATE OR REPLACE PROCEDURE prc_rename_partition (
i_owner IN VARCHAR2
, i_table_name IN VARCHAR2
)
AUTHID CURRENT_USER
IS
BEGIN
FOR v IN (SELECT a.owner
, a.table_name
, b.partition_name
, 'P' || LPAD (b.partition_position, 3, '0') AS partition_name_n
FROM dba_part_tables a
, dba_tab_partitions b
WHERE a.owner = i_owner
AND a.table_name = i_table_name
AND a.partitioning_type IN ('HASH', 'SYSTEM')
AND b.table_owner = a.owner
AND b.table_name = a.table_name
AND b.partition_name != 'P' || LPAD (b.partition_position, 3, '0'))
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || v.owner || '.' || v.table_name
|| ' RENAME PARTITION ' || v.partition_name || ' TO ' || v.partition_name_n;
END LOOP;
FOR v IN (SELECT a.owner
, a.table_name
, b.subpartition_name
, b.partition_name || '_SP' || LPAD (b.subpartition_position, 3, '0') AS subpartition_name_n
FROM dba_part_tables a
, dba_tab_subpartitions b
WHERE a.owner = i_owner
AND a.table_name = i_table_name
AND a.subpartitioning_type IN ('HASH', 'SYSTEM')
AND b.table_owner = a.owner
AND b.table_name = a.table_name
AND b.subpartition_name != b.partition_name || '_SP' || LPAD (b.subpartition_position, 3, '0'))
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || v.owner || '.' || v.table_name
|| ' RENAME SUBPARTITION ' || v.subpartition_name || ' TO ' || v.subpartition_name_n;
END LOOP;
END;
/
t1 테이블의 파티션명을 변경하기 위해 prc_rename_partition 프로시저를 수행하겠습니다.
-- 4
EXEC prc_rename_partition ('TUNA', 'T1')
아래는 t1 테이블의 파티션명을 변경한 결과입니다.
-- 5-1
SELECT partition_name, partition_position
FROM user_tab_partitions
WHERE table_name = 'T1';
PARTITION_NAME PARTITION_POSITION
-------------- ------------------
P001 1
P002 2
2 행이 선택되었습니다.
-- 5-2
SELECT partition_name, subpartition_name, partition_position, subpartition_position
FROM user_tab_subpartitions
WHERE table_name = 'T1';
PARTITION_NAME SUBPARTITION_NAME PARTITION_POSITION SUBPARTITION_POSITION
-------------- ----------------- ------------------ ---------------------
P001 P001_SP001 1 1
P001 P001_SP002 1 2
P002 P002_SP001 2 1
P002 P002_SP002 2 2
4 행이 선택되었습니다.