column_name [datatype] [generated always] as (expression) [virtual|materialized]
create table t1 (
id number,
product varchar2(50),
price number(10,2),
price_with_tax number(10,2) generated always as (round(price*1.2,2)) virtual
);
create table t2 (
id number,
product varchar2(50),
price number(10,2),
price_with_tax number(10,2) generated always as (round(price*1.2,2)) materialized
);
column table_name format a20
column column_name format a20
column virtual_column format a14
column data_default format a20
select table_name,
column_name,
virtual_column,
data_default
from user_tab_cols
where column_name = 'PRICE_WITH_TAX'
order by 1, 2;
TABLE_NAME COLUMN_NAME VIRTUAL_COLUMN DATA_DEFAULT
-------------------- -------------------- -------------- --------------------
T1 PRICE_WITH_TAX YES ROUND("PRICE"*1.2,2)
T2 PRICE_WITH_TAX NO ROUND("PRICE"*1.2,2)
SQL>
column table_name format a14
column virtual_column_name format a19
column virtual_column_expression format a25
select table_name,
virtual_column_name,
virtual_column_expression
from user_table_virtual_columns
where virtual_column_name = 'PRICE_WITH_TAX'
order by 1, 2;
TABLE_NAME VIRTUAL_COLUMN_NAME VIRTUAL_COLUMN_EXPRESSION
-------------- ------------------- -------------------------
T1 PRICE_WITH_TAX ROUND("PRICE"*1.2,2)
SQL>
insert into t1 (id, product, price) values (1, 'computer', 1500);
insert into t1 (id, product, price) values (2, 'bike', 1000);
insert into t2 (id, product, price) values (1, 'computer', 1500);
insert into t2 (id, product, price) values (2, 'bike', 1000);
commit;
column product format a15
select * from t1;
ID PRODUCT PRICE PRICE_WITH_TAX
---------- --------------- ---------- --------------
1 computer 1500 1800
2 bike 1000 1200
SQL>
select * from t2;
ID PRODUCT PRICE PRICE_WITH_TAX
---------- --------------- ---------- --------------
1 computer 1500 1800
2 bike 1000 1200
SQL>
update t1
set price = price + 10;
update t2
set price = price + 10;
commit;
select * from t1;
ID PRODUCT PRICE PRICE_WITH_TAX
---------- --------------- ---------- --------------
1 computer 1510 1812
2 bike 1010 1212
SQL>
select * from t2;
ID PRODUCT PRICE PRICE_WITH_TAX
---------- --------------- ---------- --------------
1 computer 1510 1812
2 bike 1010 1212
SQL>
update t2
set price_with_tax = 2000;
*
ERROR at line 2:
ORA-54017: UPDATE operation disallowed on virtual columns
Help: https://docs.oracle.com/error-help/db/ora-54017/
SQL>