Расширение 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)