簡體   English   中英

在oracle 12c中分割范圍分區的問題

[英]problems with splitiing the range partition in oracle 12c

我在oracle 12c中拆分rang分區時遇到問題。

我從一些來源進行了檢查,但是我想了很多。 因此它可能有一個簡單的錯誤,但我找不到它。 請檢查此代碼。 謝謝。


首先,我創建此表

CREATE TABLE SALES_SAMPLE_WITH_RANGE_PARTITION
(
DEP_NO      NUMBER (20),
PART_NO     VARCHAR2 (30),
COUNTRY     VARCHAR2(20),
DATES       DATE,
AMOUNT      NUMBER (20)
)
PARTITION BY RANGE(DATES)
(
  PARTITION q1_2012  VALUES LESS THAN(TO_DATE('2012/01/01','YYYY/MM/DD')),
  PARTITION q2_2012  VALUES LESS THAN(TO_DATE('2012/04/01','YYYY/MM/DD')),
  PARTITION q3_2012  VALUES LESS THAN(TO_DATE('2012/07/01','YYYY/MM/DD')),
  PARTITION q4_2012  VALUES LESS THAN(TO_DATE('2013/10/01','YYYY/MM/DD'))
);

之后,我將這些數據插入其中

INSERT ALL
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES (10, '4519b', 'FRANCE', (TO_DATE('2012/04/17','YYYY/MM/DD')), 45000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '3788a', 'INDIA', (TO_DATE('2012/05/11','YYYY/MM/DD')), 75000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '9519b', 'US', (TO_DATE('2012/09/18','YYYY,MM/DD')), 145000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '3788a', 'PAKISTAN', (TO_DATE('2012/06/21','YYYY/MM/DD')), 37500)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '4577b', 'US', (TO_DATE('2012/06/30','YYYY/MM/DD')), 25000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (30, '7588b', 'CANADA', (TO_DATE('2012/03/26','YYYY/MM/DD')), 50000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (30, '9519b', 'CANADA', (TO_DATE('2012/09/09','YYYY/MM/DD')), 75000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (30, '4519b', 'CANADA', (TO_DATE('2012/06/08','YYYY/MM/DD')), 120000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '3788a', 'US', (TO_DATE('2012/02/18','YYYY/MM/DD')), 4950)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (10, '9519b', 'ITALY', (TO_DATE('2012/02/19','YYYY/MM/DD')), 15000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (10, '9519a', 'FRANCE', (TO_DATE('2012/02/06','YYYY/MM/DD')), 650000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (10, '9519b', 'FRANCE', (TO_DATE('2012/12/16','YYYY/MM/DD')), 650000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '3788b', 'INDIA', (TO_DATE('2012/02/14','YYYY/MM/DD')), 5090)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '4788a', 'US',(TO_DATE('2012/09/17','YYYY/MM/DD')), 4950)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '4788b', 'US', (TO_DATE('2012/12/11','YYYY/MM/DD')), 15000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '4519a', 'INDIA', (TO_DATE('2012/11/21','YYYY/MM/DD')), 650000)
  INTO PP_SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '4519b', 'INDIA', (TO_DATE('2012/12/16','YYYY/MM/DD')), 5090)
  SELECT * FROM DUAL;

然后,我嘗試將最后一個分區分為兩部分

 ALTER TABLE PP_SALES_SAMPLE_WITH_RANGE_PARTITION SPLIT PARTITION q4_2012 AT (TO_DATE('2012/11/15','YYYY/MM/DD') INTO 
  (
  PARTITION Q4_2012_P1,
  PARTITION Q4_2012_P2
  );

不幸的是,它不起作用。 :(

請幫我一個忙,並檢查此代碼。 謝謝。

SQL> CREATE TABLE SALES_SAMPLE_WITH_RANGE_PARTITION
(
DEP_NO      NUMBER (20),
PART_NO     VARCHAR2 (30),
COUNTRY     VARCHAR2(20),
DATES       DATE,
AMOUNT      NUMBER (20)
)
PARTITION BY RANGE(DATES)
(
  PARTITION q1_2012  VALUES LESS THAN(TO_DATE('2012/01/01','YYYY/MM/DD')),
  PARTITION q2_2012  VALUES LESS THAN(TO_DATE('2012/04/01','YYYY/MM/DD')),
  PARTITION q3_2012  VALUES LESS THAN(TO_DATE('2012/07/01','YYYY/MM/DD')),
  PARTITION q4_2012  VALUES LESS THAN(TO_DATE('2013/10/01','YYYY/MM/DD'))
)
Table created.
SQL> INSERT ALL
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES (10, '4519b', 'FRANCE', (TO_DATE('2012/04/17','YYYY/MM/DD')), 45000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '3788a', 'INDIA', (TO_DATE('2012/05/11','YYYY/MM/DD')), 75000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '9519b', 'US', (TO_DATE('2012/09/18','YYYY,MM/DD')), 145000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '3788a', 'PAKISTAN', (TO_DATE('2012/06/21','YYYY/MM/DD')), 37500)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '4577b', 'US', (TO_DATE('2012/06/30','YYYY/MM/DD')), 25000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (30, '7588b', 'CANADA', (TO_DATE('2012/03/26','YYYY/MM/DD')), 50000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (30, '9519b', 'CANADA', (TO_DATE('2012/09/09','YYYY/MM/DD')), 75000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (30, '4519b', 'CANADA', (TO_DATE('2012/06/08','YYYY/MM/DD')), 120000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '3788a', 'US', (TO_DATE('2012/02/18','YYYY/MM/DD')), 4950)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (10, '9519b', 'ITALY', (TO_DATE('2012/02/19','YYYY/MM/DD')), 15000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (10, '9519a', 'FRANCE', (TO_DATE('2012/02/06','YYYY/MM/DD')), 650000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (10, '9519b', 'FRANCE', (TO_DATE('2012/12/16','YYYY/MM/DD')), 650000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '3788b', 'INDIA', (TO_DATE('2012/02/14','YYYY/MM/DD')), 5090)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '4788a', 'US',(TO_DATE('2012/09/17','YYYY/MM/DD')), 4950)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (40, '4788b', 'US', (TO_DATE('2012/12/11','YYYY/MM/DD')), 15000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '4519a', 'INDIA', (TO_DATE('2012/11/21','YYYY/MM/DD')), 650000)
  INTO SALES_SAMPLE_WITH_RANGE_PARTITION  VALUES  (20, '4519b', 'INDIA', (TO_DATE('2012/12/16','YYYY/MM/DD')), 5090)
  SELECT * FROM DUAL
17 rows created.
SQL> REM ## Gather stats and show row nums before the partiton split
SQL> BEGIN
  SYS.DBMS_STATS.GATHER_TABLE_STATS (
     OwnName           => 'SOA_USER1'
    ,TabName           => 'SALES_SAMPLE_WITH_RANGE_PARTITION'
    ,Estimate_Percent  => NULL
    ,Cascade           => TRUE
  ); 
END;
 PL/SQL procedure successfully completed.
SQL> col partition_name for a20
SQL> select partition_name, NUM_ROWS from user_tab_partitions

PARTITION_NAME         NUM_ROWS
-------------------- ----------
Q1_2012                       0
Q2_2012                       5
Q3_2012                       5
Q4_2012                       7

4 rows selected.
SQL> ALTER TABLE SALES_SAMPLE_WITH_RANGE_PARTITION SPLIT PARTITION q4_2012 AT (TO_DATE('2012/11/15','YYYY/MM/DD')) INTO 
  (
  PARTITION Q4_2012_P1,
  PARTITION Q4_2012_P2
  )
Table altered.
SQL> REM ## Gather stats and show row nums before the partiton split
SQL> BEGIN
  SYS.DBMS_STATS.GATHER_TABLE_STATS (
     OwnName           => 'SOA_USER1'
    ,TabName           => 'SALES_SAMPLE_WITH_RANGE_PARTITION'
    ,Estimate_Percent  => NULL
    ,Cascade           => TRUE
  ); 
END;
 PL/SQL procedure successfully completed.

SQL> select partition_name, NUM_ROWS from user_tab_partitions

PARTITION_NAME         NUM_ROWS
-------------------- ----------
Q1_2012                       0
Q2_2012                       5
Q3_2012                       5
Q4_2012_P1                    3
Q4_2012_P2                    4

5 rows selected.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM