Определение генерируемого значения
Спецификация
См. спецификацию пункта «Создание таблицы».
Синтаксические правила
-
Конструкция
< генерируемое значение >
применима к типам данных SMALLINT, INT, BIGINT и к любому допустимому количеству столбцов таблицы. -
Если тип данных
< генерируемого значения >
столбца указан явно, то он должен быть совместим с типом данных задаваемого< логического выражения >
или< значимого выражения >
. При отсутствии явного указания типа данных< генерируемого значения >
столбца по умолчанию ему назначается тип данных< логического выражения >
или< значимого выражения >
.create or replace table emp ( emp_no integer, emp_sal double, emp_bonus double, emp_total generated always as (emp_sal + emp_bonus));
-
Функция 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()));
Общие правила
-
При вставке записи в таблицу, содержащую столбец с
< генерируемым значением >
, вычисляется ассоциированное с ним< логическое выражение >
или< значимое выражение >
, и полученное значение становится значением этого столбца во вставляемой записи. -
Конструкция
< генерируемое значение >
с атрибутом 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 |
-
Конструкция
< генерируемое значение >
с атрибутом 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 |
-
Тип данных
< логического выражения >
или< значимого выражение >
в конструкции< генерируемое значение >
должен соответствовать типу данных столбца или быть приводимым к нему. -
Имена столбцов, задействованных в
< логическом выражении >
или в< значимом выражении >
, должны быть определены до использования их в< генерируемом значении >
.Вычисление вклада с учетом процента на заданный месяц 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 |
-
Если для
< генерируемого значения >
используется< логическое выражение >
, то объявление типа данных< генерируемого значения >
является обязательным, например:create or replace table test (b generated always as (2 >1));
– будет выдан код завершения 2705;
create or replace table test (b BOOLEAN generated always as (2 >1));
– завершится без ошибки.
-
Для
< генерируемого значения >
допустимые операции внутри< логического выражения >
те же, что и в< логическом выражении >
конструкции CHECK. -
< Логическое выражение >
для< генерируемого значения >
должно строиться из констант и ссылок на основные столбцы (без< генерируемых значений >
) определяемой таблицы. -
Особенности добавления и модификации
< генерируемых значений >
приведены в подразделах «Добавление записи» и «Корректировка записи».