取得所有含分区的表对应的表空间

本文提供了一个SQL脚本,用于自动维护分区表,包括创建表空间、添加新的分区和删除过时的分区,确保数据保留一年后被清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--按有表分区的表自动生成表空间处理语句
SELECT 'PROMPT 删除表空间(' || PARTITION_NAME || ')
DROP TABLESPACE ' || PARTITION_NAME ||
        ' INCLUDING CONTENTS AND DATAFILES;',
       'CREATE TABLESPACE ' || PARTITION_NAME || '
DATAFILE ''E:\ORADATA\GISAP\' || PARTITION_NAME ||
        '.DBF'' SIZE 8M
AUTOEXTEND ON NEXT 8M MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;',
       'ALTER USER AGGPS QUOTA UNLIMITED ON ' || PARTITION_NAME || ';'
  FROM (SELECT DISTINCT T.TABLE_NAME,
                REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(T.TABLE_NAME, 'T_'),
                                                '_'),
                                        'UNIT'),
                                'PONSESTATUS'),
                        'UNI') AS PARTITION_NAME
  FROM USER_TAB_PARTITIONS T
 WHERE T.TABLE_NAME NOT LIKE '%BIN%'
 ORDER BY T.TABLE_NAME)

  
--取得所有含分区的表对应的表空间  
SELECT DISTINCT T.TABLE_NAME,
                REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(T.TABLE_NAME, 'T_'),
                                                '_'),
                                        'UNIT'),
                                'PONSESTATUS'),
                        'UNI') AS PARTITION_NAME
  FROM USER_TAB_PARTITIONS T
 WHERE T.TABLE_NAME NOT LIKE '%BIN%'
 ORDER BY T.TABLE_NAME

 

 

--动态处理分区

 

CREATE OR REPLACE PROCEDURE P_MAINTENANCE_PARTITION_BYWSQ
--
  --编制:WSQ
  --功能:指定维护分区。即自动删除过时分区,并为分区表新增下一个月的分区  --
  --数据处理机制:所有数据保留一年,一年以后的数据将会被删除,所有表每天一个分区
  --
 IS
  L_SQL        VARCHAR2(2000);
  L_BEGIN_DATE DATE;
  L_END_DATE   DATE;
  L_BEGIN_TIME DATE;
BEGIN
  L_BEGIN_DATE := TRUNC(LAST_DAY(SYSDATE)) + 1; --下个月第一天
  L_END_DATE   := LAST_DAY(L_BEGIN_DATE); --下个月最后一天

  FOR V IN (SELECT DISTINCT T.TABLE_NAME,
                            REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(T.TABLE_NAME,
                                                                    'T_'),
                                                            '_'),
                                                    'UNIT'),
                                            'PONSESTATUS'),
                                    'UNI') AS PARTITION_NAME
              FROM USER_TAB_PARTITIONS T
             WHERE T.TABLE_NAME NOT LIKE '%BIN%'
             ORDER BY T.TABLE_NAME) LOOP
    --对 V.TABLE_NAME 指定表名进行分区维护部分开始--
    --为 V.TABLE_NAME 增加下一个月分区,每天一个分区
    L_BEGIN_TIME := L_BEGIN_DATE;
    LOOP
      EXIT WHEN(L_BEGIN_TIME > L_END_DATE);
      BEGIN
        L_SQL        := 'ALTER TABLE ' || V.TABLE_NAME ||
                        ' ADD PARTITION P_TBL_' || V.PARTITION_NAME || '_' ||
                        TO_CHAR(L_BEGIN_TIME, 'YYYYMMDD') ||
                        ' VALUES LESS THAN (
             TO_DATE(' || '''' ||
                        TO_CHAR(L_BEGIN_TIME, 'YYYY-MM-DD') || '''' ||
                        ',''YYYY-MM-DD'')) TABLESPACE ' || V.PARTITION_NAME || '';
        L_BEGIN_TIME := L_BEGIN_TIME + 1;
        EXECUTE IMMEDIATE L_SQL;
      EXCEPTION
        WHEN OTHERS THEN
          INSERT INTO T_SQL_DEBUG_LOG
            (SQL_DEBUG_LOG_ID, SQL_DEBUG_LOG, REMARKS, STAMP)
          VALUES
            (SNT_SQL_DEBUG_LOG.NEXTVAL,
             L_SQL,
             'ADD PARTITION P_TBL_' || V.PARTITION_NAME || '分区错误',
             SYSDATE);
          COMMIT;
          L_BEGIN_TIME := L_BEGIN_TIME + 1;
      END;
    END LOOP;
    --清理过时数据,此处设置保留十二个月
    FOR VV IN (SELECT TABLE_NAME, PARTITION_NAME
                 FROM USER_TAB_PARTITIONS
                WHERE TO_DATE(SUBSTR(PARTITION_NAME, -8), 'YYYY-MM-DD') <
                      ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), -12)
                  AND TABLE_NAME = V.TABLE_NAME) LOOP
      BEGIN
        --就算要删除的分区不在,程序还是可以继续执行
        L_SQL := 'ALTER TABLE  ' || V.TABLE_NAME || ' DROP PARTITION ' ||
                 VV.PARTITION_NAME;
        EXECUTE IMMEDIATE L_SQL;
      EXCEPTION
        WHEN OTHERS THEN
          BEGIN
            INSERT INTO T_SQL_DEBUG_LOG
              (SQL_DEBUG_LOG_ID, SQL_DEBUG_LOG, REMARKS, STAMP)
            VALUES
              (SNT_SQL_DEBUG_LOG.NEXTVAL,
               L_SQL,
               '删除 ' || VV.PARTITION_NAME || '分区错误',
               SYSDATE);
            COMMIT;
            NULL;
          END;
      END;
    END LOOP;
    --对 V.TABLE_NAME 进行分区维护部分结束--
  END LOOP;
END P_MAINTENANCE_PARTITION_BYWSQ;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷月宫主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值