Определение генерируемого значения
Спецификация

См. спецификацию пункта «Создание таблицы».

Синтаксические правила
  1. Конструкция < генерируемое значение > применима к типам данных SMALLINT, INT, BIGINT и к любому допустимому количеству столбцов таблицы.

  2. Если тип данных < генерируемого значения > столбца указан явно, то он должен быть совместим с типом данных задаваемого < логического выражения > или < значимого выражения >. При отсутствии явного указания типа данных < генерируемого значения > столбца по умолчанию ему назначается тип данных < логического выражения > или < значимого выражения >.

    create or replace table emp (
    emp_no integer,
    emp_sal double,
    emp_bonus double,
    emp_total generated always as (emp_sal + emp_bonus));
  3. Функция SYS_GUID() в качестве < генерируемого значения > применима только для столбцов с типом данных BYTE(n)/VARBYTE(n), где n должно быть не меньше 16.

    create or replace table tst(j int default 1, i byte(20) generated by default as (sys_guid()));
Общие правила
  1. При вставке записи в таблицу, содержащую столбец с < генерируемым значением >, вычисляется ассоциированное с ним < логическое выражение > или < значимое выражение >, и полученное значение становится значением этого столбца во вставляемой записи.

  2. Конструкция < генерируемое значение > с атрибутом BY DEFAULT AS < значимое выражение > генерирует значение по умолчанию (например, зависящее от текущего значения некоторого столбца). < Значимое выражение > может быть NULL-значением.

    create or replace table "Товары"
    ("Дата" date,
     "Курс$" decimal,
     "Товар" char(10),
     "Коэффициент" int,
     "Текущая цена" decimal generated  by default as ("Коэффициент" * "Курс$"));
    
    insert into "Товары"("Дата","Курс$", "Товар", "Коэффициент")
    values (to_date('01-aug-10'),30.2, 'Компьютер',1000);
    
    insert into "Товары"("Дата","Курс$", "Товар", "Коэффициент")
    values (to_date('03-aug-10'),27.8, 'Телевизор',500);
    
    select to_char("Дата",'dd.mm.yyyy'), "Товар","Текущая цена"  from "Товары";
    |01.08.2010|Компьютер |                30200.0         |
    |03.08.2010|Телевизор |                13900.0         |
  3. Конструкция < генерируемое значение > с атрибутом BY DEFAULT подставляет вычисляемое < логическое выражение > или < значимое выражение > только в случае отсутствующего значения столбца в добавляемой (модифицируемой) записи. < Значимое выражение > может быть NULL-значением.

    create or replace table "Товары"
    ("Дата" date,
    "Курс$" decimal,
    "Товар" char(10),
    "Коэффициент" int,
    "Текущая цена" decimal generated by default as ("Коэффициент" * "Курс$"));
    
    insert into "Товары"("Дата", "Курс$", "Товар", "Коэффициент")
    values (to_date('01-aug-10'), 30.2, 'Компьютер',1000);
    
    insert into "Товары"("Дата", "Курс$", "Товар", "Коэффициент")
    values (to_date('03-aug-10'), 27.8, 'Телевизор',500);
    
    select to_char("Дата",'dd.mm.yyyy'), "Товар", "Текущая цена" from "Товары";
    |01.08.2010|Компьютер |                30200.0         |
    |03.08.2010|Телевизор |                13900.0         |
  4. Тип данных < логического выражения > или < значимого выражение > в конструкции < генерируемое значение > должен соответствовать типу данных столбца или быть приводимым к нему.

  5. Имена столбцов, задействованных в < логическом выражении > или в < значимом выражении >, должны быть определены до использования их в < генерируемом значении >.

    Вычисление вклада с учетом процента на заданный месяц
    create or replace table test
    (col1 real,
    col2 decimal default 7.5,
    col3 date,
    col4 decimal generated by default
    as (col1+col1*col2/100/12*datesplit(col3,'M')));
    
    insert into test (col1, col3) 
      values (45000, to_date('21.06.2017','dd.mm.yyyy'));
    
    insert into test (col1, col3) 
      values (100000.6, to_date('05.07.2017','dd.mm.yyyy'));
    select * from test;
    
    |col1    |col2|col3               |col4      |
    |45000   | 7.5|21.06.2017:00:00:00|46687.5   |
    |100000.6| 7.5|05.07.2017:00:00:00|104375.625|
    
    create or replace table test (col1 char(20), col2 boolean generated by default as (col1 is null));
    insert into test(col1)  values ('12345');
    insert into test(col1)  values (null);
    select * from test
    |col1    |col2 |
    |12345   |false|
    |null    |true |
  6. Если для < генерируемого значения > используется < логическое выражение >, то объявление типа данных < генерируемого значения > является обязательным, например:

    create or replace table test (b generated always as (2 >1));

    – будет выдан код завершения 2705;

    create or replace table test (b BOOLEAN generated always as (2 >1));

    – завершится без ошибки.

  7. Для < генерируемого значения > допустимые операции внутри < логического выражения > те же, что и в < логическом выражении > конструкции CHECK.

  8. < Логическое выражение > для < генерируемого значения > должно строиться из констант и ссылок на основные столбцы (без < генерируемых значений >) определяемой таблицы.

  9. Особенности добавления и модификации < генерируемых значений > приведены в подразделах «Добавление записи» и «Корректировка записи».