本节列出了影响 PL/Perl 的配置参数。
plperl.on_init
(string
) #指定在首次初始化 Perl 解释器时,在将其专门用于 plperl
或 plperlu
之前执行的 Perl 代码。执行此代码时,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;
如果 plperl
库包含在 shared_preload_libraries 中,则初始化将在 postmaster 中进行,在这种情况下,应格外注意使 postmaster 不稳定的风险。使用此功能的主要原因是,由 plperl.on_init
加载的 Perl 模块只需在 postmaster 启动时加载,并且可以在各个数据库会话中立即使用,而无需加载开销。但是,请记住,仅对于数据库会话使用的第一个 Perl 解释器(对于第一个调用 PL/Perl 函数的 SQL 角色,可以是 PL/PerlU 或 PL/Perl)才能避免开销。在数据库会话中创建的任何其他 Perl 解释器都必须重新执行 plperl.on_init
。此外,在 Windows 上,预加载没有任何节省,因为在 postmaster 进程中创建的 Perl 解释器不会传播到子进程。
此参数只能在 postgresql.conf
文件中或服务器命令行上设置。
plperl.on_plperl_init
(string
) plperl.on_plperlu_init
(string
) #这些参数指定在 Perl 解释器专门用于 plperl
或 plperlu
时要执行的 Perl 代码。当在数据库会话中首次执行 PL/Perl 或 PL/PerlU 函数时,或者当由于调用了另一种语言或新的 SQL 角色调用了 PL/Perl 函数而必须创建额外的解释器时,将会发生这种情况。这遵循 plperl.on_init
所做的任何初始化。执行此代码时,SPI 函数不可用。plperl.on_plperl_init
中的 Perl 代码在解释器 “锁定”后执行,因此它只能执行受信任的操作。
如果代码失败并出现错误,它将中止初始化并传播到调用查询,从而导致当前事务或子事务中止。Perl 中已完成的任何操作都不会被撤消;但是,该解释器将不再使用。如果再次使用该语言,将在新的 Perl 解释器中再次尝试初始化。
只有超级用户才能更改这些设置。尽管可以在会话中更改这些设置,但此类更改不会影响已经用于执行函数的 Perl 解释器。
plperl.use_strict
(boolean
) #如果设置为 true,则后续编译的 PL/Perl 函数将启用 strict
编译指示。此参数不影响当前会话中已编译的函数。
PL/Perl 当前缺少以下功能,但它们将是受欢迎的贡献。
PL/Perl 函数不能直接相互调用。
SPI 尚未完全实现。
如果您正在使用 spi_exec_query
获取非常大的数据集,则应注意这些数据都将进入内存。您可以通过使用 spi_query
/spi_fetchrow
来避免这种情况,如前所述。
如果设置返回函数通过 return
将大量行集返回给 PostgreSQL,则会出现类似的问题。您也可以通过改为对返回的每一行使用 return_next
来避免此问题,如前所示。
当会话正常结束时(不是由于致命错误),将执行已定义的任何 END
块。目前没有执行其他操作。具体来说,文件句柄不会自动刷新,对象也不会自动销毁。
如果您在文档中发现任何不正确、与您特定功能体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。