Виртуальные колонки
Виртуальные колонки - это колонки, которые вычисляются на основе других колонок таблицы.
Создание виртуальных колонок
INFO
Виртуальные колонки были добавлены в 11 версии Oracle.
create table cars(
id number primary key,
model varchar2(100) not null,
engine_volume number,
max_speed_km number not null,
max_speed_ml generated always as
(max_speed_km / 1.609));
comment on column cars.max_speed_km is
'Максимальная скорость, км/ч';
comment on column cars.max_speed_ml is
'Максимальная скорость, миль/ч';
create table cars(
id number primary key,
model varchar2(100) not null,
engine_volume number,
max_speed_km number not null,
max_speed_ml generated always as
(max_speed_km / 1.609));
comment on column cars.max_speed_km is
'Максимальная скорость, км/ч';
comment on column cars.max_speed_ml is
'Максимальная скорость, миль/ч';
Здесь максимальная скорость в милях вычисляется на основании данных о максимальной скорости автомобиля в километрах.
Фраза generated always
используется для улучшения читаемости - чтобы было понятнее, что колонка будет вычисляемой. Объявить колонку max_speed_ml
можно было и без нее:
max_speed_ml as (max_speed_km / 1609.344)
Указывать тип данных в колонке необязательно - Oracle сможет определить его на основании выражения, которое ее описывает.
Когда мы добавляем данные в таблицу, виртуальные колонки не должны нигде указываться, т.к. они будут вычислены автоматически:
insert into cars(id, model, engine_volume, max_speed_km)
values(1, 'Tesla', NULL, 250);
insert into cars(id, model, engine_volume, max_speed_km)
values(1, 'Tesla', NULL, 250);
Теперь посмотрим на данные в таблице:
| ID | MODEL | ENGINE_VOLUME | MAX_SPEED_KM | MAX_SPEED_ML |
| 1 | Tesla | - | 250 | 155.37 |
На самом деле значение в вычисляемой колонке будет другим, т.к. мы не использовали округление при его вычислении. Для удобства отображения мы оставили лишь 2 знака после запятой.
Добавление виртуальной колонки к уже существующей таблице
alter table cars
add(
max_speed_m generated always as
(max_speed_km * 1000)
);
alter table cars
add(
max_speed_m generated always as
(max_speed_km * 1000)
);
Теперь в таблице хранится и скорость автомобиля в метрах в час:
select id,
max_speed_km,
round(max_speed_ml, 2) msm,
max_speed_m
from cars
select id,
max_speed_km,
round(max_speed_ml, 2) msm,
max_speed_m
from cars
| ID | MAX_SPEED_KM | MSM | MAX_SPEED_M |
| 1 | 250 | 155.38 | 250000 |
Когда использовать виртуальные колонки
Виртуальные колонки позволяют не использовать представления в тех случаях, когда колонки, которые часто требуются наравне с "чистыми" данными таблицы, можно вычислить на основании этих самых чистых данных.
В таком случае ваша схема БД будет проще - за всеми необходимыми данными обращаемся напрямую к таблице.