Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Инструкция CREATE/ALTER TYPE советы и хитрости в PostgreSQL

Платформа PostgreSQL поддерживает инструкцию CREATE TYPE, используемую для создания нового типа данных, но не поддерживает инструкцию ALTER TYPE. Реализация инструкции CREATE TYPE в PostgreSQL нестандартная.

CREATE TYPE имя_типа

(INPUT=имя_входной_функции, OUTPUT=имя_выходной_функции, INTERNALLENGTH =

{int | VARIABLE} [, DEFAULT=значение] [, ELEMENT=тип_данных_массива]

[, DELIMITER=символ_разделитель] [, PASSEDBYVALUE] [, ALIGNMENT =

{CHAR | INT2 | INT4 | DOUBLE}] [, STORAGE={PLAIN | EXTERNAL | EXTENDED | MAIN}])

Параметры приведены ниже.

CREATE TYPE имя_типа

Создается новый пользовательский тип данных с именем имя_типа. Длина имени не может превышать 30 символов, и оно не должно начинаться с символа подчеркивания.

INPUT=имя входной_функции

Объявляется имя ранее созданной функции, которая преобразует значения внешних аргументов в форму, которая может использоваться внутри типа.

OUTPUT — имя выходной_функции

Объявляется имя ранее созданной функции, которая преобразует внутренние выходные значения в форму, используемую при отображении.

INTERNALLENGTH={int | VARIABLE}

Указывается числовое значение (int), показывающее внутреннюю длину нового типа, если тип данных имеет фиксированную длину. Ключевое слово VARIABLE объявляет, что внутренняя длина является переменной. По умолчанию принимается VARIABLE.

DEFAULT=значение

Для типа объявляется значение по умолчанию.

ELEMENT’= тип _данных_массива

Объявляется, что тип данных является массивом, а параметр тип_данных массива представляет собой тип данных для элементов массива. Например, массив, содержащий целые числа, следует объявить как ELEMENT=INT4. Как правило, следует оставить для параметра тип_данных_массива значение по умолчанию. Единственный случай, когда может понадобиться заменить заданное по умолчанию значение, — это создание пользовательского типа фиксированной длины, состоящего из массива множества идентичных элементов, к которому необходим прямой доступ через индекс.

DELIMITER=символразделитель

Указывается символ, используемый в качестве разделителя между выходными значениями массива, создаваемого при помощи типа. Используется только с предложением ELEMENT. По умолчанию — запятая.

PASSEDBYVALUE

Указывается, что для типа данных передаются значения, а не ссылки. Это необязательное предложение, которое нельзя использовать для типов, значения которых имеют длину большую, чем длина типа DATUM (в большинстве операционных систем -4 байта, на некоторых — 8 байт).

ALIGNMENT={CHAR | INT2 | INT4 | DOUBLE}

Определяет для типа выравнивание данных при хранении. Разрешается использовать четыре типа, каждый из которых соответствует определенной границе. Тип CHAR соответствует 1 байту, INT2 — 2 байтам, INT4 — 4 байтам (необходимое требование для пользовательских типов переменной длины в PostgreSQL). Тип DOUBLE соответствует 8 байтам.

STORAGE={PLAIN |, EXTERNAL | EXTENDED MAIN}

Определяется метод хранения пользовательских типов переменной длины. (Для типов с фиксированной длиной требуется вариант PLAIN) Допустимыми являются четыре метода.

PLAIN

Пользовательский тип хранится во встроенном виде, если он объявлен как тип данных для столбца таблицы и не сжат.

EXTERNAL

Пользовательский тип хранится за пределами таблицы. Попытки сжать его не предпринимаются.

EXTENDED

Пользовательский тип хранится в сжатом виде, если он умещается в таблице. Если он оказывается слишком длинным, PostgreSQL будет хранить его за пределами таблицы.

MAIN

Пользовательский тип хранится в таблице в сжатом виде. Бывают ситуации, когда PostgreSQL не может сохранить пользовательский тип в таблице, потому что он слишком велик. При указании параметра MAIN система больше всего старается сохранить пользовательский тип вместе со всеми прочими табличными данными. Если вы создаете в PostgreSQL новый тип данных, он будет доступен только в текущей базе данных. Владельцем является тот пользователь, который создал этот тип.

Чтобы создать новый тип данных, перед его определением вы должны создать, как минимум, две функции. Если коротко, вы должны создать функцию INPUT, которая предоставляет типу внешние значения, чтобы они могли использоваться операторами и функциями внутри типа. Также вы должны создать функцию OUTPUT, которая создает внешнее представление типа данных. Для создания функций INPUT и OUTPUT есть несколько дополнительных требований.

Функция INPUT должна либо принимать один аргумент типа OPAQUE, либо принимать три аргумента — OPAQUE, OID и INT4. В последнем случае параметр OPAQUE представляет собой входной текст в виде строки стиля С, OID — это тип элемента для массивов, a INT4 — это модификатор типа для целевого столбца (если известен).

Функция OUTPUT должна либо принимать один аргумент типа OPAQUE, либо принимать два аргумента типов OPAQUE и OID. В последнем случае OPAQUE -это сам тип данных, a OID — это тип элемента для массивов (если необходимо).

Например, мы можем создать пользовательский тип с именем floorplan и использовать его при определении столбца в двух таблицах — house и condo.

CREATE TYPE floorplan

(INTERNALLENGTH=12, INPUT=squarefoot_calc_proc, OUTPUT=out_floorplan_proc);

CREATE TABLE house

(house_plan_id int4, size floorplan

descrip varchar(30));

CREATE TABLE condo

(condo_plan_id INT4, size floorplan

descrip varchar(30) location_id varchar(7));

Источник