CREATE LANGUAGE
Определение нового языка, используемого при создании функций.
Синтаксис:
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE 'язык' HANDLER обработчик LANCOMPILER 'комментарий'
Параметры:
- TRUSTED. Ключевое слово TRUSTED означает, что PostgreSQL разрешает непривилегированным пользователям обходить ограничения, связанные с наличием прав доступа к языку'. Если в процессе определения языка этот параметр не указывался, то использование языка для создания новых функций будет разрешено лишь суперпользователям.
- PROCEDURAL. Необязательное ключевое слово PROCEDURAL. Делает команду CREATE LANGUAGE более наглядной, но не влияет на ее работу.
- язык. Имя нового процедурного языка (без учета регистра символов). Переопределение имен существующих, встроенных языков PostgreSQL не допускается.
- HANDLER обработчик. Имя заранее определенной функции, вызываемой при выполнении процедур PL.
- комментарий. Строка, сохраняемая в поле lancompiler системной таблицы pg_language. Секция LANCOMPILER оставлена для обеспечения совместимости, не имеет практического смысла и может быть удалена в следующих версиях PostgreSQL. Тем не менее в версии 7.1.x ее присутствие остается обязательным.
Результаты:
- CREATE. Сообщение выдается при успешном определении нового языка.
- ERROR: PL handler function обработчик() doesn't exist. Ошибка – функция, указанная в параметре HANDLER, не существует.
Описание
Команда CREATE LANGUAGE загружает новый процедурный язык в подключенную базу данных. Она используется с процедурными языками, указанными с ключом --with-язык при первоначальной установке PostgreSQL. Например, для включения поддержки pltcl следует передать ключ --with-tcl в процессе конфигурирования PostgreSQL.
После выполнения этой команды вы сможете создавать новые функции на добавленном языке. Команда CREATE LANGUAGE может выполняться только суперпользователем.
В PostgreSQL 7.1.x (последней версии на момент написания книги) модификация созданных языков не поддерживается. Чтобы изменить определение процедурного языка, необходимо удалить его из базы данных командой DROP LANGUAGE и создать заново.
Примечание
Если команда CREATE LANGUAGE создает язык в базе данных templatel, поддержка этого языка будет автоматически включаться во все базы данных, созданные на основе этого шаблона (используемого по умолчанию).
Чтобы процедурный язык мог использоваться в PostgreSQL, для него должен быть написан специальный обработчик вызовов, откомпилированный в двоичный формат. Следовательно, для написания обработчиков требуются только компилируемые языки (такие, как С и C++).
Обработчик вызовов также должен быть отдельно определен в PostgreSQL как функция, вызываемая без аргументов и возвращающая тип opaque. Подобное определение обработчика предотвращает непосредственный вызов функции в командах SQL.
Примеры
При выполнении команды CREATE LANGUAGE обработчик для соответствующего языка должен быть создан заранее. Регистрация процедурных языков начинается с создания функции, задающей местонахождение объектного кода обработчика. В следующем фрагменте создается обработчик, объектный код которого находится в файле /usr/local/pgsql/lib/libexample.so:
booktown=# CREATE FUNCTION example_call_handler ( ) RETURNS opaque booktown-# AS '/usr/local/pgsql/lib/libexample.so' booktown-# LANGUAGE 'C'; CREATE
На втором этапе командой CREATE LANGUAGE существующий язык загружается в подключенную базу данных. В следующем примере создается язык plexample, использующий обработчик из предыдущего примера:
booktown=# CREATE PROCEDURAL LANGUAGE 'piexample' booktown-# HANDLER example_call_handler booktown-# LANCOMPILER 'My Example': CREATE