0

200 のパーティションを持つ範囲パーティション テーブルを作成する必要があります。例:

CREATE TABLE emp (
     empno NUMBER(4), 
     ename VARCHAR2(30), 
     sal   NUMBER
) 
PARTITION BY RANGE(empno) (
partition e1 values less than (1000)     , 
partition e2 values less than (2000)     , 
...
partition e200 values less than (MAXVALUE) 

);

範囲を指定するだけで200行も書かずに範囲間隔を指定する方法はありますか?

4

2 に答える 2

3

使用している Oracle のバージョンはわかりませんでしたが、Oracle のバージョンが 11g である場合は、テーブルの間隔パーティション分割を確立できるステートメントINTERVALの句があります。CREATE TABLE次に例を示します。

SQL> Create table TB_PART_TEST(
  2    id number
  3  )
  4  partition by range(id)
  5  interval(1000)
  6  (
  7    partition Part_01 values less than (1000)
  8  );  

 table created

 SQL> select partition_name
   2       , high_value
   3    from user_tab_partitions
   4   where table_name = 'TB_PART_TEST';



PARTITION_NAME  HIGH_VALUE
 ------------------------------
  PART_01           1000 


  SQL> insert into TB_PART_TEST(id)
    2    values(1500); 

  1 row created

  SQL> commit;

  commit complete

  SQL> select partition_name
   2       , high_value
   3    from user_tab_partitions
   4   where table_name = 'TB_PART_TEST';

  PARTITION_NAME  HIGH_VALUE
 ------------------------------
  PART_01           1000 
  SYS_P63           2000
于 2012-10-31T08:37:29.960 に答える
3
CREATE TABLE emp (
     empno NUMBER(4), 
     ename VARCHAR2(30), 
     sal   NUMBER
) 
PARTITION BY RANGE(empno) (
partition e1 values less than (1000));

begin
  for k in 2..200 
  loop
     execute immediate 
       'alter table emp add partition e'||k||' values less than  ('||k*1000||')';
  end loop
end;

更新: 11g には、範囲パーティションの間隔を指定する機能があり、テーブルに挿入するとパーティションが作成されます。

しかし、私はそれが好きではなく、次の 2 つの理由からお勧めしません。

1 参照であるため、常に最初のパーティションを保持する必要があります。ドロップしようとすると、次のようになりますSQL Error: ORA-14758: Last partition in the range section cannot be dropped

2パーティション名(AFAIK)と間隔(これは醜い)を制御できません。将来誤って値を挿入すると、一部のパーティションがスキップされ、ファット パーティションが取得されます: (少し調べたところ、ファット パーティションはありません。例に追加されました。)

 Create table Z_TB_PART_TEST(
    id number
  )
  partition by range(id)
  interval(1000)
 (
    PARTITION PART_01 VALUES LESS THAN (1000)
 );  

 INSERT INTO Z_TB_PART_TEST values (1500);
 INSERT INTO Z_TB_PART_TEST VALUES (10000);
 INSERT INTO Z_TB_PART_TEST VALUES (5000);


  SELECT partition_name , high_value
  FROM USER_TAB_PARTITIONS
  WHERE table_name = 'Z_TB_PART_TEST';

  PART_01   1000
  SYS_P141  2000
  SYS_P142  11000
  SYS_P143  6000

UPDATE2 : Nicholas Krasnov は、ポイント 1 の回避策をコメントで示しました。

ORA-14758はどうですか?これは簡単に回避できます。一時的に間隔分割テーブルを範囲分割テーブルに変換し ( alter table tb_table_test set interval())、パーティションを削除してから、間隔分割テーブルに戻します ( alter table tb_part_test set interval(1000))。

それは動作します、私はそれをテストしました。ただし、すべてのパーティションがフリーズすることに注意してください。それらは範囲パーティションになります。ギャップがある場合は残ります(ギャップにパーティションは追加されません)。したがって、参照パーティションは、に変更する前の最後のパーティションになりintervalます。エラーの内容は次のとおりですLast partition in the range section cannot be dropped

したがって、すべての利点を備えた範囲パーティション化のセクションと間隔パーティション化のセクションがあります。

于 2012-10-31T07:35:32.527 に答える