×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

5.8.8. Внутреннее устройство PL/Perl

5.8.8.1. Конфигурация
5.8.8.2. Ограничения и недостающая функциональность

5.8.8.1. Конфигурация #

В данном разделе перечислены параметры конфигурации, влияющие на PL/Perl.

plperl.on_init (string) #

Задаёт код на языке Perl, который выполняется при первой инициализации интерпретатора Perl инициализируется перед тем, как он будет специализирован для использования в plperl или plperlu. Функции интерфейса SPI недоступны во время выполнения данного кода. Если при выполнении кода произойдет ошибка, это приведет к прерыванию инициализации интерпретатора и передаче исключения в вызывающий запрос, что вызовет отмену текущей транзакции или подтранзакции.

Код на языке Perl ограничен одной строкой. Более объемный код может быть размещен в модуле и загружен с помощью этой on_init строки. Примеры:

plperl.on_init = 'require "plperlinit.pl"'
plperl.on_init = 'use lib "/my/app"; use MyApp::PgInit;'

Любые модули, загруженные через plperl.on_init, прямо или косвенно, будут доступны для использования в plperl. Это может создать угрозу безопасности. Для просмотра списка загруженных модулей можно использовать следующую команду:

DO 'elog(WARNING, join ", ", sort keys %INC)' конструкция LANGUAGE plperl;

Инициализация будет выполняться в процессе postmaster, если plperl библиотека включена в shared_preload_libraries, в этом случае следует уделить особое внимание риску дестабилизации работы процесса postmaster. Основная причина использования данного функционала заключается в том, что модули Perl, загружаемые с помощью plperl.on_init должны быть загружены только при запуске postmaster и будут мгновенно доступны без накладных расходов на загрузку в отдельных сессиях базы данных. Однако следует учитывать, что накладных расходов удастся избежать только для первого интерпретатора Perl, используемого в сессии базы данных — либо PL/PerlU, либо PL/Perl для первой SQL-роли, вызывающей функцию PL/Perl. Любые дополнительные интерпретаторы Perl, созданные в сессии базы данных, должны будут выполнять инициализацию plperl.on_init заново. Кроме того, в Windows предварительная загрузка не даст никакой экономии, так как интерпретатор Perl интерпретатор, созданный в процессе postmaster, не распространяется на дочерние процессы.

Данный параметр может быть задан только в postgresql.conf файле конфигурации или в командной строке сервера.

plperl.on_plperl_init (string)
plperl.on_plperlu_init (string) #

Эти параметры определяют код Perl, который должен быть выполнен при специализации интерпретатора Perl для plperl или plperlu соответственно. Это происходит при первом выполнении функции PL/Perl или PL/PerlU в сеансе базы данных, либо в случае, когда требуется создание дополнительного интерпретатора из-за вызова другого языка или вызова функции PL/Perl новой SQL-ролью. Это следует за любой инициализацией, выполненной plperl.on_init. Функции интерфейса SPI недоступны во время выполнения данного кода. Код Perl в plperl.on_plperl_init выполняется после «блокировки среды» интерпретатора, и, следовательно, в нём могут выполняться только доверенные операции.

Если выполнение кода завершается ошибкой, инициализация прерывается, а ошибка передается в вызывающий запрос, что приводит к отмене текущей транзакции или подтранзакции. Любые действия, уже выполненные в Perl, не будут отменены; однако данный интерпретатор более не будет использоваться. При повторном обращении к языку будет предпринята попытка инициализации в новом интерпретаторе Perl.

Изменять эти параметры могут только суперпользователи. Хотя эти параметры можно изменить в рамках сеанса, такие изменения не затронут интерпретаторы Perl, которые уже использовались для выполнения функций.

plperl.use_strict (boolean) #

Если установлено значение true, при последующих компиляциях функций PL/Perl будет strict включена прагма. Данный параметр не влияет на функции, уже скомпилированные в текущем сеансе.

5.8.8.2. Ограничения и недостающая функциональность #

В настоящее время в PL/Perl отсутствует следующая функциональность, однако вклад в её реализацию приветствуется.

  • Функции PL/Perl не могут вызывать друг друга напрямую.

  • Интерфейс SPI на данный момент реализован не полностью.

  • Если для получения очень больших наборов данных используется spi_exec_query, необходимо учитывать, что все они будут загружены в память. Этого можно избежать путем использования spi_query/spi_fetchrow как было показано ранее.

    Аналогичная проблема возникает, если функция, возвращающая набор данных, передает большой набор строк обратно в PostgreSQL через return. Эту проблему также можно предотвратить, используя вместо этого return_next для каждой возвращаемой строки, как показано ранее.

  • При нормальном завершении сеанса (не вызванном фатальной ошибкой) любые END блоки, которые были определены, выполняются. В настоящее время никакие другие действия не выполняются. В частности, файловые дескрипторы автоматически не сбрасываются, а объекты не уничтожаются автоматически.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению