در اوراکل 11g، زمانی که یک جدول با متد list پارتیشن بندی می شود، تعداد پارتیشنها ثابت خواهد بود و در صورتی که قصد درج مقداری خارج از مقادیر تعریف شده برای partition key را داشته باشیم، با خطا مواجه خواهیم شد(در صورت عدم تعریف default partition):
SQL> CREATE TABLE person( id NUMBER, name VARCHAR2(30),EYE_COLOR VARCHAR2(10) )
2 PARTITION BY LIST (EYE_COLOR)
3 (PARTITION p1 VALUES (‘BL’),
4 PARTITION p2 VALUES (‘GR’)
5 );
Table created
SQL> insert into person values(1,’hadi’,’BC’);
ORA-14400: inserted partition key does not map to any partition
این مسئله در اوراکل 12cR1 هم صادق است که یکی از راهکارهای جلوگیری از این خطا در نسخه 11g و 12cR1، تعریف پارتیشن Default می باشد که در این صورت، مقادیر تعریف نشده، در این پارتیشن قرار خواهند گرفت:
SQL> drop table person;
Table dropped
SQL> CREATE TABLE person( id NUMBER, name VARCHAR2(30),EYE_COLOR VARCHAR2(10) )
2 PARTITION BY LIST (EYE_COLOR)
3 (PARTITION p1 VALUES (‘BL’),
4 PARTITION p2 VALUES (‘GR’),
5 PARTITION p3 VALUES (default)
6 );
Table created
SQL> insert into person values(1,’hadi’,’BC’);
1 row inserted
در اوراکل 12cR2 قابلیت auto-list partitioning در این زمینه ارائه شد که بر اساس ان با درج مقدار جدید(تعریف نشده) برای ستون partition key، بصورت خودکار، پارتیشن جدیدی به جدول اضافه خواهد شد و به صورت کلی، میتوان هر مقدار جدید را در یک پارتیشن مجزا قرار داد.
این کار با اضافه کردن کلمه AUTOMATIC بعد از عبارت Partition by list قابل انجام خواهد بود:
SQL> CREATE TABLE person( id NUMBER, name VARCHAR2(30),EYE_COLOR VARCHAR2(10) )
2 PARTITION BY LIST (EYE_COLOR)
3 AUTOMATIC
4 (PARTITION p1 VALUES (‘BL’),
5 PARTITION p2 VALUES (‘GR’)
6 );
Table created
SQL> insert into person values(1,’hadi’,’BC’);
1 row inserted
SQL> select p.partition_name from dba_tab_partitions p where p.table_name=’PERSON’;
PARTITION_NAME
——————————————————————————–
P1
P2
SYS_P919
SQL> insert into person values(2,’reza’,’HN’);
1 row inserted
SQL> select p.partition_name from dba_tab_partitions p where p.table_name=’PERSON’;
PARTITION_NAME
——————————————————————————–
P1
P2
SYS_P919
SYS_P920
در صورتی که جدولی به صورت non-auto list پارتیشن بندی شده باشد به کمک دستور زیر، می توان پارتیشن بندی آن را بصورت auto list تغییر داد:
SQL> ALTER TABLE person SET AUTOMATIC;
Table altered
برای برگرداندن نوع پارتیشن به حالت non-auto list، باید دستور زیر را اجرا کرد:
SQL> alter table person set partitioning manual;
Table altered
البته اگر برای آن جدول، پارتیشن Default تعریف شده باشد، دستور فوق با خطا مواجه خواهد شد:
SQL> ALTER TABLE person SET AUTOMATIC;
ORA-14852: SET [SUB]PARTITIONING AUTOMATIC is not legal on this table.
در این صورت باید پارتیشن Default را حذف کرده و سپس دستور را اجرا نمود:
SQL> ALTER TABLE person DROP PARTITION (P3);
Table altered
SQL> ALTER TABLE person SET AUTOMATIC;
Table altered
برای مشاهده لیست جداولی که از قابلیت auto-list partititioning استفاده می کنند می توان به ستون autolist در ویوی user_part_tables رجوع کرد:
SQL> SELECT table_name, autolist,autolist_subpartition FROM dba_part_tables where autolist=’YES’;
Comment (1)