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