Иллюстрированный самоучитель по PostgreSQL

Расширение PostgreSQL

Создание оператора

Новые операторы создаются командой SQL CREATE OPERATOR. Синтаксис команды CREATE OPERATOR:

CREATE OPERATOR оператор (PROCEDURE = функция
[. LEFTARG = тип1 ]
[. RIGHTARG = тип2 ]
[. COMMUTATOR = коммутатор ]
[. NEGATOR = инвертор ]
[. RESTRICT = функция ограничения ]
[. JOIN = функция_обьединения ]
[. HASHES ]
[. SORT1 = левдя_сортировкд ]
[. SORT2 = правая_сортировка ])

В этом определении оператор – символ нового оператора, а функция – имя функции, вызываемой этим оператором. Остальные секции не обязательны, хотя в определении должна присутствовать хотя бы одна из секций LEFTARG или RIGHTARG. Оператор может состоять из следующих символов:

*-*/<>=~!@#*π&|-?$

Примечание
За дополнительной информацией об остальных секциях команды CREATE OPERATOR и ограничениях на символы операторов обращайтесь к документации
.

Если в команде CREATE OPERATOR указан только тип данных LEFTARG, оператор работает только с левым операндом (константой или идентификатором). И наоборот, если указан только тип RIGHTARG, оператор работает только с правым операндом. При указании обоих типов данных, LEFTARG и RIGHTARG, оператор работает с обоими операндами, левым и правым.

Хорошим примером встроенного оператора, использующего только левый операнд, является оператор факториала (!), а оператор сложения работает с обоими операндами. Количество аргументов функции, указанной в команде CREATE OPERATOR, должно соответствовать использованию ключевых слов LEFTARG и RIGHTARG (один или два аргумента). Более того, типы аргументов функции должны соответствовать типам, указанным в команде CREATE OPERATOR.

В листинге 7.53 создается оператор!#, левый операнд которого передается функции is_zero() (см. листинг 7.49). Следовательно, обозначение х!# эквивалентно вызову функции is_zero(x).

Листинг 7.53. Создание пользовательского оператора.

booktown=# CREATE OPERATOR!# (PROCEDURE = is_zero,
booktown(# LEFTARG = integer);
CREATE

Сообщение CREATE означает, что создание оператора прошло успешно. Новый оператор становится доступным для любого пользователя, подключенного к базе данных (по аналогии с функциями). Оператор принадлежит пользователю, создавшему его, и поэтому не может быть удален другим пользователем, не обладающим правами суперпользователя. В листинге 7.54 новый оператор!# возвращает из таблицы stock список книг, отсутствующих на складе.

Листинг 7.54. Применение пользовательского оператора.

booktown=# SELECT * FROM stock WHERE stock!#;
isbn | cost | retail | stock
0394900014 | 23.00 | 23.95 | 0
0451198492 | 36.00 | 46.95 | 0
0451457994 | 17.00 j 22.95 | 0
(3 rows)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.