下面是创建分区表:

CREATE TABLE IISPR.HISGPRS_DATA_T
(
  SID           VARCHAR2(11 BYTE)               NOT NULL,
  GPS_TIME      DATE                            NOT NULL,
  LONGITUDE     NUMBER(11,4)                    DEFAULT 0,
  LATITUDE      NUMBER(11,4)                    DEFAULT 0,
  ALTITUDE      NUMBER(11,4)                    DEFAULT 0,
  VELOCITY      NUMBER(7,4)                     DEFAULT 0,
  ANGLE         NUMBER(7,4)                     DEFAULT 0,
  ALARM_STATUS  NUMBER(8)                       DEFAULT 0,
  SYS_ID        NUMBER(38)                      NOT NULL,
  DISC_ID       VARCHAR2(11 BYTE),
  DISC_TYPE     VARCHAR2(11 BYTE),
  ROAM_FLAG     VARCHAR2(11 BYTE),
  DISC_CODE     VARCHAR2(11 BYTE),
  OWNER_CODE    VARCHAR2(11 BYTE),
  SEND_FLAG     NUMBER(11)     DEFAULT 1      NOT NULL,
  SEND_TIME     DATE,
  CREAT_TIME    DATE,
  MSG_SEQ       VARCHAR2(30 BYTE),
  GET_FLAG      NUMBER(11)                      DEFAULT 0
)
TABLESPACE TBS_GPRS
PCTUSED    10
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          20M
            NEXT             20M
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
PARTITION BY RANGE (GPS_TIME) SUBPARTITION BY HASH (SID)
        SUBPARTITIONS 4 STORE IN (TBS_GPRS_SUB_1,TBS_GPRS_SUB_2,TBS_GPRS_SUB_3,TBS_GPRS_SUB_4)
(
PARTITION HISGPRS_B2007 VALUES LESS THAN(TO_DATE('2007-01-01','YYYY-MM-DD')) 
        NOLOGGING
        NOCOMPRESS
        PCTUSED    10
        PCTFREE    10
        INITRANS   1
        MAXTRANS   255
)
CACHE
NOLOGGING
NOPARALLEL
NOMONITORING;批量创建最近180天的分区
set  serverout on
declare
str   varchar2(4000);
i       number(4);
begin
    for i in 0 .. 180loop
    
        str :=  'alter table hisgprs_data_t add partition HISGPRS_'||  to_char(sysdate-i,'yyyymmdd') ||' values less than ( to_date('''|| to_char(sysdate-i+1,'yyyy-mm-dd')||''',''yyyy-mm-dd'')) tablespace TBS_GPRS';
        dbms_output.put_line(str);
        execute  immediate str;    end loop;end;
出现下列错误,请问如何修改上述代码:
ERROR 位于第 1 行:
ORA-14074: 分区界限必须调整为高于最后一个分区界限
ORA-06512: 在line 9

解决方案 »

  1.   


    sysdate-i+1改为 sysdate-180+i 之后执行出现:*
    ERROR 位于第 1 行:
    ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
    ORA-06512: 在"SYS.DBMS_OUTPUT", line 35
    ORA-06512: 在"SYS.DBMS_OUTPUT", line 198
    ORA-06512: 在"SYS.DBMS_OUTPUT", line 139
    ORA-06512: 在line 8
      

  2.   

    1.加分区必须从小到大的加,你加反了,所以报ORA-14074错。2.在你的过程里:
    ...
    values less than ( to_date('''|| to_char(sysdate-i+1,'yyyy-mm-dd')||''',''yyyy-mm-dd'')) tablespace TBS_GPRS'; 
    ...
    里面无需先to_char
      

  3.   


    改成下面还是同样的错误呀
    set  serverout on
    declare
    str   varchar2(4000);
    i       number(4);
    begin
        for i in 0 .. 180loop
        
            str :=  'alter table hisgprs_data_t add partition HISGPRS_'||  to_char(sysdate-180+i,'yyyymmdd') ||' values less than ( to_date('''|| to_char(sysdate-180+i+1,'yyyy-mm-dd')||''',''yyyy-mm-dd'')) tablespace TBS_GPRS';
            dbms_output.put_line(str);
            execute  immediate str;    end loop;end;
      

  4.   

    ORA-14074: partition bound must collate higher than that of the last partitionCause: Partition bound specified in ALTER TABLE ADD PARTITION statement did not collate higher than that of the table's last partition, which is illegal.Action: Ensure that the partition bound of the partition to be added collates higher than that of the table's last partition.看看这个解释,和VC555说的一样,是加反了!
     str :=  'alter table hisgprs_data_t add partition HISGPRS_'||  to_char(sysdate-180+i-1,'yyyymmdd') ||' values less than ( to_date('''|| to_char(sysdate-180+i,'yyyy-mm-dd')||''',''yyyy-mm-dd'')) tablespace TBS_GPRS'; 改成这样子试试!