2013-02-18 5 views
4

날짜 필드를 기반으로하는 파티션이있는 테이블이 있습니다. 이제 2 개월 이상 된 모든 파티션을 삭제하는 절차를 작성해야합니다. 즉, test_date는 2 개월 이상되었습니다. 어떻게해야합니까? 사전에2 개월 이상 지난 파티션 삭제

create table test_table 
(
test_id number, 
test_date date, 
constraint pk_test primary key (test_id) 
) 
partition by range (test_date) 
(
PARTITION pt01122012 VALUES LESS THAN (TO_DATE('01-DEC- 
2012', 'DD-MON-YYYY')), 
PARTITION pt01022013 VALUES LESS THAN (TO_DATE('01-FEB- 
2013', 'DD-MON-YYYY')), 
PARTITION pt01042013 VALUES LESS THAN (TO_DATE('01-APR- 
2013', 'DD-MON-YYYY')), 
PARTITION pt01062013 VALUES LESS THAN (TO_DATE('01-JUN- 
2013', 'DD-MON-YYYY')), 
PARTITION pt01082013 VALUES LESS THAN (TO_DATE('01-AUG- 
2013', 'DD-MON-YYYY')) 
); 

감사합니다 ...

답변

11

첫째,이 때문에 당신이 처음에 수동으로 모든 DDL을 실행할 수 있습니다, 그 파티션은 오라클에 고급 될 수 있습니다 지적하고 싶습니다 당신까지 ' DDL 스크립트를 실행하는 데 충분히 자신감을 가져야합니다. 또한 을 이해하지 않고도으로 테스트하지 않고 인터넷에서 스크립트를 절대 실행하지 말 것을 권합니다. 특히 DDL 스크립트.

지금 손에서 문제를 들어, 파티션 경계를 검색 할 *_TAB_PARTITIONS 사전 뷰를 조회 할 수 있습니다

SQL> SELECT partition_name, high_value 
    2 FROM user_tab_partitions 
    3 WHERE table_name = 'TEST_TABLE'; 

PARTITION_NAME HIGH_VALUE 
--------------- -------------------------------------------------------- 
PT01122012  TO_DATE(' 2012-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
PT01022013  TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
PT01042013  TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
PT01062013  TO_DATE(' 2013-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
PT01082013  TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 

이 열은 유형 LONG (= 사용되지 LOB)이다 그래서 우리는 함께 필터링 할 수있는 몇 가지 도구를 가지고 SQL을 사용하려면 PL/SQL을 사용해야합니다.

SQL> BEGIN 
    2  FOR cc IN (SELECT partition_name, high_value -- 
    3     FROM user_tab_partitions 
    4     WHERE table_name = 'TEST_TABLE') LOOP 
    5  EXECUTE IMMEDIATE 
    6   'BEGIN 
    7    IF sysdate >= ADD_MONTHS(' || cc.high_value || ', 2) THEN 
    8     EXECUTE IMMEDIATE 
    9      ''ALTER TABLE TEST_TABLE DROP PARTITION ' 
10      || cc.partition_name || ' 
11      ''; 
12    END IF; 
13   END;'; 
14  END LOOP; 
15 END; 
16/

PL/SQL procedure successfully completed 

SQL> SELECT partition_name, high_value 
    2 FROM user_tab_partitions 
    3 WHERE table_name = 'TEST_TABLE'; 

PARTITION_NAME HIGH_VALUE 
--------------- ----------------------------------------------------------- 
PT01022013  TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 
PT01042013  TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 
PT01062013  TO_DATE(' 2013-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 
PT01082013  TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 
+0

절차 적 접근 방식을 삭제하는 다른 방법을 제안 해주십시오. – TomJava

+0

테이블에있는 기본 키는 어떻게됩니까? – TomJava

+1

@TomJava 늦었지만 다른 사람들이 나중에 올 것임을 알고 있습니다. 이것은 설명서 이외의 최선의 방법입니다. update indexes 문을 추가하여 파티션 삭제의 결과로 다시 작성되도록 할 수 있습니다. IOT가 파티션 된 경우 "글로벌 인덱스 업데이트" –

관련 문제