Skip to content

Виртуальные колонки

Виртуальные колонки - это колонки, которые вычисляются на основе других колонок таблицы.

Создание виртуальных колонок

INFO

Виртуальные колонки были добавлены в 11 версии Oracle.

sql
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 сможет определить его на основании выражения, которое ее описывает.

Когда мы добавляем данные в таблицу, виртуальные колонки не должны нигде указываться, т.к. они будут вычислены автоматически:

sql
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 знака после запятой.

Добавление виртуальной колонки к уже существующей таблице

sql
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)
);

Теперь в таблице хранится и скорость автомобиля в метрах в час:

sql
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 |

Когда использовать виртуальные колонки

Виртуальные колонки позволяют не использовать представления в тех случаях, когда колонки, которые часто требуются наравне с "чистыми" данными таблицы, можно вычислить на основании этих самых чистых данных.

В таком случае ваша схема БД будет проще - за всеми необходимыми данными обращаемся напрямую к таблице.