VIRTUAL в Oracle SQL — как создавать вычисляемые столбцы

🟢 VIRTUAL в Oracle SQL. Введение

VIRTUAL — это специальный атрибут столбца в Oracle, позволяющий создать вычисляемый столбец, значение которого не хранится физически в таблице, а вычисляется на лету при обращении.

Это удобно, когда нужно автоматически получать производные данные (например, сумму, длину строки, форматированную дату), не занимая дополнительное место в хранилище.


🔤 Написание

sql
CREATE TABLE имя_таблицы (
колонка_1 тип,
колонка_2 тип,
виртуальная_колонка тип GENERATED ALWAYS AS (выражение) VIRTUAL
);

🔄 Где используется

  • Автоматическое вычисление значений

  • Оптимизация хранилища

  • Поддержание бизнес-правил без триггеров

  • Упрощение аналитики и отчётности

  • Поддержка логики, основанной на других колонках


🧪 10 Примеров использования VIRTUAL

1️⃣ Простая вычисляемая колонка

sql
CREATE TABLE products (
price NUMBER,
tax NUMBER,
total_price NUMBER GENERATED ALWAYS AS (price + tax) VIRTUAL
);

2️⃣ Форматирование даты

sql
CREATE TABLE events (
event_date DATE,
event_year NUMBER GENERATED ALWAYS AS (EXTRACT(YEAR FROM event_date)) VIRTUAL
);

3️⃣ Вычисление длины строки

sql
CREATE TABLE customers (
name VARCHAR2(100),
name_length NUMBER GENERATED ALWAYS AS (LENGTH(name)) VIRTUAL
);

4️⃣ Комбинация нескольких колонок

sql
CREATE TABLE users (
first_name VARCHAR2(50),
last_name VARCHAR2(50),
full_name VARCHAR2(101) GENERATED ALWAYS AS (first_name || ' ' || last_name) VIRTUAL
);

5️⃣ Конвертация единиц

sql
CREATE TABLE measurements (
meters NUMBER,
centimeters NUMBER GENERATED ALWAYS AS (meters * 100) VIRTUAL
);

6️⃣ Автоматический расчёт статуса

sql
CREATE TABLE orders (
paid_amount NUMBER,
total_amount NUMBER,
is_fully_paid VARCHAR2(5) GENERATED ALWAYS AS (
CASE WHEN paid_amount >= total_amount THEN 'YES' ELSE 'NO' END
) VIRTUAL
);

7️⃣ Поиск по виртуальному столбцу

sql
SELECT * FROM users
WHERE full_name LIKE 'John%';

Виртуальные столбцы можно использовать в WHERE, ORDER BY, GROUP BY.


8️⃣ Добавление в существующую таблицу

sql
ALTER TABLE employees
ADD age NUMBER GENERATED ALWAYS AS (FLOOR(MONTHS_BETWEEN(SYSDATE, birth_date)/12)) VIRTUAL;

9️⃣ Ограничения на виртуальные поля

sql
-- Нельзя вставлять или обновлять значение в VIRTUAL-столбце вручную
INSERT INTO products (price, tax, total_price) VALUES (100, 20, 120);
-- Ошибка: ORA-54013

🔟 Проверка всех виртуальных столбцов в схеме

sql
SELECT table_name, column_name, data_default
FROM user_tab_cols
WHERE virtual_column = 'YES';

🧩 VIRTUAL в Oracle SQL. Заключение

VIRTUAL-столбцы — это эффективный способ создать вычисляемые поля, которые не занимают место, но автоматически возвращают нужное значение. Это упрощает работу, снижает нагрузку на код, исключает дублирование логики и делает данные более самодостаточными.

💡 Запомни:

  • VIRTUAL = вычисляется на лету, не хранится

  • Отлично для логики, основанной на других полях

  • Нельзя вставить значение напрямую

  • Работает как обычный столбец в SELECT, WHERE, JOIN


🔜 Следующая статья:

VIEW в Oracle SQL — как создавать представления для запросов


 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии