파티션명 변경 프로시저

2023. 6. 9.·Oracle/Administration

해시 파티션과 시스템 파티션은 직접 파티션명을 지정하지 않거나 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 행이 선택되었습니다.
저작자표시 비영리 변경금지 (새창열림)
'Oracle/Administration' 카테고리의 다른 글
  • Read Only PDB User
  • LOB 세그먼트명 변경 프로시저
  • Asynchronous Global Index Maintenance
  • Precheckable Constraints using JSON SCHEMA
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 주력해 왔으며, 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며, Oracle 사의 공식 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (199)
      • Oracle (171)
        • SQL (33)
        • PLSQL (10)
        • Performance (74)
        • Administration (37)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (5)
      • Exadata (15)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • 공지사항

  • 인기 글

  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정희락
파티션명 변경 프로시저
상단으로

티스토리툴바