Поддержка PL/pgSQL
Поддержка языков программирования реализуется отдельным объектом базы
данных. Таким образом, прежде чем использовать язык PL/pgSQL, необходимо
включить его поддержку в базу данных (по умолчанию PL/pgSQL устанавливается
вместе с PostgreSQL). В этом разделе описана процедура включения PL/pgSQL
в существующую базу данных
Поддержка PL/pgSQL в базах данных PostgreSQL включается либо приложением
createlang в командной строке, либо командой SQL CREATE LANGUAGE в клиенте
(например, в psql). Команда CREATE LANGUAGE требует предварительного создания
обработчика вызовов PL/pgSQL — функции, которая занимается непосредственной
обработкой и интерпретацией кола PL/pgSQL.
С утилитой createlang проще работать, потому что она абстрагирует от
пользователя создание обработчика вызовов и языка, но ниже будут описаны
оба способа.
ПРИМЕЧАНИЕ
Установка PL/pgSQL в базе данных template! приводит к тому,
в дальнейшем PL/pgSQL автоматически устанавливается во всех базах данных,
создаваемых на основе шаблона tempi ate! (используемого по умолчанию).
Включение поддержки PL/pgSQL при помощи psql
Команда SQL CREATE LANGUAGE предназначена для включения поддержки процедурных
языков в текущую базу данных. Тем не менее перед вызовом этой команды
необходимо предварительно создать обработчик вызовов функцией CREATE FUNCTION.
Синтаксис создания обработчика вызовов PL/pgSQL командой CREATE FUNCTION:
CREATE FUNCTION plpgsql_call_handler()
RETURNS OPAQUE AS '/библиот-ека_р05£дге5/р1 pgsql
.so1 LANGUAGE 'C'
Параметр библиотека jjostgres определяет абсолютный системный путь к
установленным библиотечным файлам PostgreSQL. По умолчанию это путь /usr/local/
psql/lib. В листинге 11.1 приведен пример создания обработчика вызовов
PL/pgSQL функцией CREATE FUNCTION (предполагается, что файл plpgsql.so
находится в каталоге по умолчанию).
Листинг 11.1. Создание обработчика вызовов
PL/pgSQL
booktown=# CREATE FUNCTION plpgsql_call_handler ()
booktown-# RETURNS OPAQUE
booktown-# AS '/usr/local/pgsql/lib/plpgsql.so'
booktown-l LANGUAGE 'C';
CREATE
В листинге 11.1 создается только обработчик, а поддержка языка включается
командой CREATE LANGUAGE. Синтаксис включения PL/pgSQL в базу данных:
CREATE LANGUAGE 'plpgsqV HANDLER plpgsql_call_handler
LANCOMPILER 'PL/pgSQL'
Здесь pi pgsql — обозначение языка, pi pgsql _ca! IJiand I er — имя
обработчика, созданного командой CREATE FUNCTION (см. листинг 11.1), а
строковая константа PL/ pgSQL, следующая за ключевым словом LANCOMPILER,
содержит произвольное описание.
В листинге 11.2 команда CREATE LANGUAGE включает в базу данных booktown
поддержку PL/pgSQL.
Листинг 11.2. Включение поддержки PL/pgSQL
командой CREATE LANGUAGE
booktown=# CREATE LANGUAGE 'plpgsql' HANDLER pipgsql_call_handler
booktown-# LANCOMPILER 'PL/pgSQL';
CREATE
За ключевым словом HANDLER указывается то же имя, которое было указано
при создании обработчика вызовов. В листинге 11.1 создавался обработчик
с именем plpgsql_cal IJiandler, поэтому в листинге 11.2 используется то
же имя.
Секция LANCOMPILER считается устаревшей, она унаследована от старых версий
и ни на что не влияет. Несмотря на это, в PostgreSQL 7.1.x эта секция
является обязательной. Обычно в ней вводится краткое описание языка.
Включение поддержки PL/pgSQL приложением createlang
Приложение createlang запускается в режиме командной строки. Если имя
пользователя операционной системы, с которым вы зарегистрированы в настоящий
момент, совпадает с именем суперпользователя целевой базы данных, для
вызова createlang можно воспользоваться командой, приведенной в листинге
11.3 (при необходимости вам будет предложено ввести пароль). В противном
случае имя суперпользователя базы данных передается приложению createlang
с флагом -U, как показано в листинге 11.4.
Листинг 11.3. Использование приложения createlang
суперпользователем базы данных
$ cd /usr/local/pgsql/bin
booktown=# createlang plpgsql booktown
Листинг 11.4. Передача имени суперпользователя
при вызове createlang
$ cd /usr/local/pgsql/bin
$ createlang plpgsql -U manager booktown
При успешном завершении программа createlang возвращает управление режиму
командной строки без какого-либо вывода.
|