plperl

PL/Perl 存储过程语言

概览

扩展包名版本分类许可证语言
plperl1.0LANGPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
3260plperlpg_catalog
3261bool_plperl-
3262hstore_plperl-
3263jsonb_plperl-
相关扩展plperl plperlu bool_plperlu jsonb_plperlu hstore_plperlu plpgsql pg_tle plv8 pllua
下游依赖bool_plperl hstore_plperl jsonb_plperl plperl sparql

版本

PG18PG17PG16PG15PG14
1.01.01.01.01.0

安装

提示:这是 PostgreSQL 内核自带的 contrib 扩展

CREATE EXTENSION plperl;

用法

plperl: PL/Perl 受信过程语言

PL/Perl 允许使用 Perl 编写 PostgreSQL 函数。作为受信语言,它在受限环境中运行,无法访问文件系统或外部模块。

CREATE EXTENSION plperl;

-- 简单标量函数
CREATE FUNCTION perl_hello(text) RETURNS text
LANGUAGE plperl AS $$
  my ($name) = @_;
  return "Hello, $name!";
$$;

SELECT perl_hello('world');

-- 使用 Perl 正则表达式处理文本
CREATE FUNCTION clean_whitespace(text) RETURNS text
LANGUAGE plperl AS $$
  my ($str) = @_;
  $str =~ s/^\s+|\s+$//g;   # 去除首尾空白
  $str =~ s/\s+/ /g;         # 合并内部空白
  return $str;
$$;

-- 返回复合类型
CREATE TYPE name_parts AS (first_name text, last_name text);

CREATE FUNCTION split_name(text) RETURNS name_parts
LANGUAGE plperl AS $$
  my ($full) = @_;
  my ($first, $last) = split(/\s+/, $full, 2);
  return { first_name => $first, last_name => $last };
$$;

-- 集合返回函数
CREATE FUNCTION perl_generate_series(integer, integer) RETURNS SETOF integer
LANGUAGE plperl AS $$
  my ($start, $stop) = @_;
  for my $i ($start .. $stop) {
    return_next($i);
  }
  return undef;
$$;

-- 触发器函数
CREATE FUNCTION perl_audit_trigger() RETURNS trigger
LANGUAGE plperl AS $$
  $_TD->{new}{modified_at} = localtime();
  return "MODIFY";
$$;

数据库访问使用 spi_exec_query

CREATE FUNCTION perl_row_count(text) RETURNS integer
LANGUAGE plperl AS $$
  my ($table) = @_;
  my $rv = spi_exec_query("SELECT count(*) AS cnt FROM $table");
  return $rv->{rows}[0]{cnt};
$$;

最后修改 2026-03-14: update extension metadata (953cbd0)