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

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

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