Oracle 11g supports specifying a Virtual Column as the Partition Key.
A Virtual Column is a column where the value is derived on the basis of an expression on other columns or sql/plsql functions. The actual value is not stored in the block holding the row but is computed when the row is retrieved.
For example :
The MY_SALES_TABLE can be List, Range or Hash Partitioned on SALE_YEAR.
Thus, the SALE_YEAR value is not actually stored on disk, yet each partition has rows based on the SALE_YEAR (derived) value.
A Virtual Column is a column where the value is derived on the basis of an expression on other columns or sql/plsql functions. The actual value is not stored in the block holding the row but is computed when the row is retrieved.
For example :
create table my_sales_table
(invoice_id number primary key,
invoice_date date,
sale_year number(4) generated always as ( to_number(to_char(invoice_date,'YYYY')) ) virtual,
customer_id number,
sale_value number
)
/
insert into my_sales_table
(invoice_id, invoice_date, customer_id, sale_value)
values
(1,sysdate,100,10200)
/
select invoice_id, invoice_date, sale_year
from my_sales_table
/
INVOICE_ID INVOICE_DATE SALE_YEAR
1 28-NOV-18 2018
The MY_SALES_TABLE can be List, Range or Hash Partitioned on SALE_YEAR.
drop table my_sales_table;
create table my_sales_table
(invoice_id number primary key,
invoice_date date,
sale_year number(4) generated always as ( to_number(to_char(invoice_date,'YYYY')) ) virtual,
customer_id number,
sale_value number
)
partition by list(sale_year)
(partition p_2018 values (2018),
partition p_2019 values (2019),
partition p_2020 values (2020)
)
/
insert into my_sales_table
(invoice_id, invoice_date, customer_id, sale_value)
values
(1,sysdate,100,10200)
/
select invoice_date, sale_year from my_sales_table partition (p_2018)
/
INVOICE_DATE SALE_YEAR
28-NOV-18 2018
Thus, the SALE_YEAR value is not actually stored on disk, yet each partition has rows based on the SALE_YEAR (derived) value.