Oracle 11g Virtual Columns: Featured Activities
Indexing on Virtual Columns
Virtual columns can be indexed like any other non virtual columns. The index
created is always a function based index. If the index is B-tree index, it is
recognized as FUNCTION-BASED NORMAL. For bitmap indexes, it is recognized as
FUNCTION-BASED BITMAP.
Example [9]
Sample Code
SQL> CREATE INDEX IDX_VIRT ON T_VIRT (C);
INDEX created.
Copyright exforsys.com
The index IDX_VIRT will behave as a function based index. Oracle internally
indexes the expression associated with the value.

Constraints can be imposed upon Virtual Columns
Similar to normal columns, all types of constraints can be imposed upon
virtual columns. The example below uses the virtual column C to be the primary
key of the table T_VIRT.
Example [10]
Sample Code
SQL> ALTER TABLE T_VIRT ADD PRIMARY KEY (C) </p><br>
TABLE altered.
SQL> SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = 'T_VIRT';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
-------------------- -------------------- --------------------
SYS_C0012705 T_VIRT C
Copyright exforsys.com
Virtual Column can participate in Table partitioning
Virtual Column based partitioning can be applied with all the partitioning
techniques. In the illustration below, a table T_VIRT_PART is created using
Interval Partitioning Technique.
Example [11]
Sample Code
CREATE TABLE T_VIRT_PART (A NUMBER,
B NUMBER,
C AS (A+B))
PARTITION BY RANGE (C)
INTERVAL (10000)
(PARTITION P0 VALUES LESS THAN (20000),
PARTITION P1 VALUES LESS THAN (30000),
PARTITION P2 VALUES LESS THAN (40000))
/
TABLE created.
Copyright exforsys.com
Test data is inserted into the partitions.
Sample Code
SQL> INSERT INTO T_VIRT_PART(A,B) VALUES (&N,&M);
Enter value FOR n: 3829
Enter value FOR m: 8292
old 1: INSERT INTO T_VIRT_PART(A,B) VALUES (&N,&M)
new 1: INSERT INTO T_VIRT_PART(A,B) VALUES (3829,8292)
1 row created.
SQL> /
Enter value FOR n: 9201
Enter value FOR m: 492
old 1: INSERT INTO T_VIRT_PART(A,B) VALUES (&N,&M)
new 1: INSERT INTO T_VIRT_PART(A,B) VALUES (9201,492)
1 row created.
SQL> /
Enter value FOR n: 1739
Enter value FOR m: 8293
old 1: INSERT INTO T_VIRT_PART(A,B) VALUES (&N,&M)
new 1: INSERT INTO T_VIRT_PART(A,B) VALUES (1739,8293)
1 row created.
SQL> /
Enter value FOR n: 11392
Enter value FOR m: 10982
old 1: INSERT INTO T_VIRT_PART(A,B) VALUES (&N,&M)
new 1: INSERT INTO T_VIRT_PART(A,B) VALUES (11392,10982)
1 row created.
SQL> /
Enter value FOR n: 23992
Enter value FOR m: 11392
old 1: INSERT INTO T_VIRT_PART(A,B) VALUES (&N,&M)
new 1: INSERT INTO T_VIRT_PART(A,B) VALUES (23992,11392)
1 row created.
SQL> /
Enter value FOR n: 33820
Enter value FOR m: 4292
old 1: INSERT INTO T_VIRT_PART(A,B) VALUES (&N,&M)
new 1: INSERT INTO T_VIRT_PART(A,B) VALUES (33820,4292)
1 row created.
SQL> SELECT * FROM T_VIRT_PART;
A B C
---------- ---------- ----------
3829 8292 12121
9201 492 9693
1739 8293 10032
11392 10982 22374
23992 11392 35384
33820 4292 38112
6 rows selected.
Copyright exforsys.com
Now, we can query the table with their partition names.
Sample Code
SQL> SELECT * FROM T_VIRT_PART PARTITION (P0);
A B C
---------- ---------- ----------
3829 8292 12121
9201 492 9693
1739 8293 10032
SQL> SELECT * FROM T_VIRT_PART PARTITION (P1);
A B C
---------- ---------- ----------
11392 10982 22374
SQL> SELECT * FROM T_VIRT_PART PARTITION (P2);
A B C
---------- ---------- ----------
23992 11392 35384
33820 4292 38112
Copyright exforsys.com
To demonstrate Interval Partitioning, we shall insert a data whose value
falls out of specified partition range (High_Value). In this situation, oracle
server implicitly creates a partition suffixed by SYS_.
Example [12]
Sample Code
SQL> INSERT INTO T_VIRT_PART (A,B) VALUES (37282,17282);
1 row created.
SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE, INTERVAL FROM
USER_TAB_PARTITIONS WHERE TABLE_NAME = 'T_VIRT_PART';
TABLE_NAME PARTITION_NAME HIGH_VALUE INT
-------------------- -------------------- -------------------- ---
T_VIRT_PART P0 20000 NO
T_VIRT_PART P1 30000 NO
T_VIRT_PART P2 40000 NO
T_VIRT_PART SYS_P41 60000 YES
SQL> SELECT * FROM T_VIRT_PART PARTITION (SYS_P41);
A B C
---------- ---------- ----------
37282 17282 54564
Copyright exforsys.com
Virtual Columns: Advantages
The strongest benefit from virtual columns is that they are physically stored
in database but their values do not occupy the disk space. Values are generated
at runtime through the derivative expression and still, statistics can be
generated for the column.
In addition, virtual column gives benefit of indexing, partitioning and
constraint imposition.
This tutorial is part of a Oracle 11g Tutorial tutorial series. Read it from the beginning and learn yourself.
H I D E