Расширение PostgreSQL
Создание функций SQL
Из всех разновидностей функций в PostgreSQL проще всего создаются "чистые" функции SQL, поскольку их создание не требует ни знания других языков, ни серьезного опыта программирования. Функция SQL определяется как обычная команда с позиционными параметрами.
Позиционный параметр представляет собой ссылку на один из аргументов, переданных при вызове функции SQL. Он называется позиционным, поскольку в ссылке указывается его позиция в списке переданных аргументов. Позиционный параметр состоит из знака $, за которым следует номер (нумерация начинается с 1). Например, $1 означает первый аргумент в переданном списке.
В листинге 7.46 создается функция isbn_to_title, которая возвращает название книги по заданному коду ISBN. Функция получает один аргумент типа text и возвращает результат того же типа.
Листинг 7.46. Создание функции SQL.
booktown=# CREATE FUNCTION isbn_to_title(text) RETURNS text booktown-l AS 'SELECT title FROM books booktown'f JOIN editions AS e (isbn .id) booktown'# USING (id) booktown'# WHERE isbn = $1' booktown-# LANGUAGE 'SQL'; CREATE
Позиционный параметр $1 при выборке заменяется значением первого аргумента в списке, переданном при вызове функции isbn_to_title. Позиционный параметр не заключается в отдельные апострофы, поскольку апострофы являются частью переданного аргумента. Остальные составляющие определения функции являются либо идентификаторами, либо стандартными ключевыми словами SQL.
Сообщение CREATE означает, что создание функции прошло успешно. В листинге 7.47 функция isbn_to_title вызывается с одним текстовым аргументом 0929605942. Функция возвращает название книги, связанное с этим кодом ISBN. При этом используется код SQL, содержащийся в листинге 7.46.
Листинг 7.47. Использование функции SQL.
booktown=# SELECT isbn_to_title('0929605942'); isbn to title The Tell-Tale Heart (1 row)
Созданная функция доступна для всех пользователей, обладающих соответствующими правами. Например, для выполнения функции isbn_to_title необходим доступ для чтения к таблицам editions и books (права пользователей описаны в главе 10).
Создание функций на языке С
СУБД PostgreSQL, написанная на языке С, может динамически подгружать откомпилированный код С без перекомпиляции пакета. Использование команды CREATE FUNCTION для компоновки с функциями С разрешено только суперпользователям, поскольку эти функции могут содержать системные вызовы, представляющие потенциальную угрозу для безопасности системы.
Документирование всего интерфейса API системы PostgreSQL выходит за рамки книги. Впрочем, опытный программист сможет очень легко написать, откомпилировать и скомпоновать простейшие функции С с использованием загружаемых общих модулей.
У компилятора gcc (GNU С Compiler) имеется ключ – shared, предназначенный для создания динамически загружаемых модулей. В простейшем случае загружаемый модуль создается командой следующего вида:
$ gcc – shared input.с – о output.so
Здесь input.с – имя файла, содержащего компилируемый код С, a output.so – файл общего загружаемого модуля.