Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3693130
  • 博文数量: 715
  • 博客积分: 1860
  • 博客等级: 上尉
  • 技术积分: 7745
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-07 08:51
个人简介

偶尔有空上来看看

文章分类

全部博文(715)

文章存档

2023年(75)

2022年(134)

2021年(238)

2020年(115)

2019年(11)

2018年(9)

2017年(9)

2016年(17)

2015年(7)

2014年(4)

2013年(1)

2012年(11)

2011年(27)

2010年(35)

2009年(11)

2008年(11)

分类: Oracle

2022-09-01 10:06:58

1
  1. drop table ACCT;
  2. CREATE TABLE ACCT
  3. (
  4.   user_id NUMBER,
  5.   user_name VARCHAR2(20),
  6.   insertdate DATE
  7. )
  8. tablespace users
  9. PARTITION BY RANGE(insertdate)
  10. INTERVAL (NUMTODSINTERVAL(1,'day')) STORE IN (users)
  11. (
  12.   PARTITION part20220820 VALUES LESS THAN(to_date('2022-08-21 00:00:00','yyyy-mm-dd hh24:mi:ss'))
  13. );

  14. insert into acct values (1,'aaa',to_date('2022-08-10','yyyy-mm-dd'));
  15. insert into acct values (2,'bbb',to_date('2022-08-25','yyyy-mm-dd'));
  16. insert into acct values (3,'ccc',to_date('2022-08-26','yyyy-mm-dd'));
  17. insert into acct values (4,'ddd',to_date('2022-09-11','yyyy-mm-dd'));
  18. commit;
  19. select * from ACCT;

  20. set lin 200
  21. col TABLESPACE_NAME for a12
  22. col table_name for a10
  23. col PARTITION_NAME for a20
  24. col HIGH_VALUE for a85
  25. col PARTITION_POSITION for 999
  26. select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME,NUM_ROWS from DBA_tab_partitions where TABLE_NAME='ACCT';


如果想要改这些间隔分区的名称,可以尝试一下:
  1. set serverout on

  2. create FUNCTION DailyPartition(tableName IN VARCHAR2) RETURN BOOLEAN IS

  3.     EXPRESSION_IS_OF_WRONG_TYPE EXCEPTION;
  4.     PRAGMA EXCEPTION_INIT(EXPRESSION_IS_OF_WRONG_TYPE, -6550);

  5.     ds INTERVAL DAY TO SECOND;
  6.     ym INTERVAL YEAR TO MONTH;
  7.     str VARCHAR2(1000);

  8. BEGIN
  9.     SELECT INTERVAL INTO str
  10.     FROM USER_PART_TABLES
  11.     WHERE TABLE_NAME = tableName;

  12.     EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT ym;
  13.     RETURN FALSE;
  14. EXCEPTION
  15.     WHEN EXPRESSION_IS_OF_WRONG_TYPE THEN
  16.         EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT ds;
  17.         RETURN TRUE;
  18. END DailyPartition;
  19. /



  20. create PROCEDURE RenamePartitions IS

  21.     ts TIMESTAMP;
  22.     newName VARCHAR2(30);

  23.     CURSOR TabPartitions IS
  24.     SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
  25.     FROM USER_TAB_PARTITIONS
  26.     WHERE TABLE_NAME IN ('ACCT', 'TEST') --这里改为你想要改分区名称的间隔分区表
  27.         AND PARTITION_NAME <> 'P_INITIAL'
  28.     ORDER BY 1,2;

  29. BEGIN

  30.     EXECUTE IMMEDIATE 'ALTER SESSION SET DDL_LOCK_TIMEOUT = 180';

  31.     FOR aPart IN TabPartitions LOOP
  32.         EXECUTE IMMEDIATE 'BEGIN :ret := '||aPart.HIGH_VALUE||'; END;' USING OUT ts;
  33.         IF DailyPartition(aPart.TABLE_NAME) THEN
  34.             ts := ts - INTERVAL '1' DAY;
  35.             newName := 'P_'||TO_CHAR(ts,'yyyy_mm_dd');
  36.         ELSE
  37.             ts := ADD_MONTHS(ts, -1);
  38.             newName := 'P_'||TO_CHAR(ts,'yyyy_mm');
  39.         END IF;
  40.         IF aPart.PARTITION_NAME <> newName THEN
  41.             EXECUTE IMMEDIATE 'ALTER TABLE '||aPart.TABLE_NAME||' RENAME PARTITION '||aPart.PARTITION_NAME||' TO '||newName;
  42.         END IF;
  43.     END LOOP;

  44. END RenamePartitions;
  45. /
引自
  1. https://stackoverflow.com/questions/41443756/oracle-automatic-partitioning-name-pattern-for-partitions
修改后效果如下:
看着清晰多了吧。

阅读(531) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~