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

Расширение 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 – файл общего загружаемого модуля.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.