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

Виртуальные колонки были добавлены в 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
	'Максимальная скорость, миль/ч';

Здесь максимальная скорость в милях вычисляется на основании данных о максимальной скорости автомобиля в километрах.

Фраза 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);

Теперь посмотрим на данные в таблице:

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

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

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 |

Когда их можно использовать?

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

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

Комментарии