# 45.8.引擎盖下的PL/Perl
# 45.8.1.配置
本节列出了影响PL/Perl的配置参数。
指定在Perl解释器被专门化以供用户使用之前,在Perl解释器首次初始化时要执行的Perl代码plperl
或普帕鲁
.执行此代码时,SPI功能不可用。如果代码失败并出现错误,它将中止解释器的初始化,并传播到调用查询,导致当前事务或子事务中止。
Perl代码仅限于一个字符串。较长的代码可以放入模块中,并由关于_init
一串例如:
plperl.on_init = 'require "plperlinit.pl"'
plperl.on_init = 'use lib "/my/app"; use MyApp::PgInit;'
任何由plperl。关于_init
,将直接或间接提供给plperl
.这可能会造成安全风险。要查看加载了哪些模块,可以使用:
DO 'elog(WARNING, join ", ", sort keys %INC)' LANGUAGE plperl;
如果plperl
图书馆包含在共享_预加载_图书馆,在这种情况下,应额外考虑破坏邮政署署长稳定的风险。使用此功能的主要原因是plperl。关于_init
只需要在postmaster启动时加载,并且将立即可用,而无需在单个数据库会话中加载开销。但是,请记住,只有在数据库会话使用的第一个Perl解释器(PL/PerlU或PL/Perl用于调用PL/Perl函数的第一个SQL角色)中,才能避免开销。必须执行在数据库会话中创建的任何其他Perl解释器plperl。关于_init
重新开始此外,在Windows上,预加载不会带来任何节约,因为在postmaster进程中创建的Perl解释器不会传播到子进程。
此参数只能在postgresql。形态
文件或在服务器命令行上。
plperl。关于_plperl _init
(一串
)
plperl。关于_plperlu _init
(一串
)
这些参数指定当Perl解释器专门用于plperl
或普帕鲁
分别地当在数据库会话中首次执行PL/Perl或PL/PerlU函数时,或者由于调用另一种语言或新的SQL角色调用PL/Perl函数而必须创建额外的解释器时,就会发生这种情况。这将遵循由执行的任何初始化plperl。关于_init
.执行此代码时,SPI功能不可用。中的Perl代码plperl。关于_plperl _init
在“锁定”解释器后执行,因此它只能执行受信任的操作。
如果代码失败并出现错误,它将中止初始化并传播到调用查询,导致当前事务或子事务中止。Perl中已经完成的任何操作都不会被撤销;然而,这个口译员将不再被使用。如果再次使用该语言,将在新的Perl解释器中再次尝试初始化。
只有超级用户才能更改这些设置。虽然这些设置可以在会话中更改,但这些更改不会影响已经用于执行函数的Perl解释器。
当设置为true时,PL/Perl函数的后续编译将具有严格的
启用了pragma。此参数不影响当前会话中已编译的函数。
# 45.8.2.限制和缺少的功能
PL/Perl目前缺少以下特性,但它们将做出值得欢迎的贡献。
PL/Perl函数不能直接相互调用。
SPI尚未完全实施。
如果您使用
spi_执行查询
,你应该意识到这些都会被记住。你可以通过使用spi_查询
/斯皮乌·费特罗
如前所述。如果集合返回函数通过
回来
.你也可以通过使用下次再来
对于返回的每一行,如前所示。当会话正常结束(不是由于致命错误)时
终止
执行已定义的块。目前没有执行其他操作。具体来说,文件句柄不会自动刷新,对象也不会自动销毁。