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