plr

从数据库中加载R语言解释器并执行R脚本

概览

扩展包名版本分类许可证语言
plr8.4.8LANGGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
3100plr-
相关扩展plpgsql pgml plpython3u pg_tle plv8 pljava plperl pllua

missing el10.x86_64

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG8.4.81817161514plr-
RPMPGDG8.4.81817161514plr_$v-
DEBPGDG8.4.81817161514postgresql-$v-plr-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

您可以直接安装 plr 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install plr;          # 当前活跃 PG 版本安装
pig ext install -y plr -v 18  # PG 18
pig ext install -y plr -v 17  # PG 17
pig ext install -y plr -v 16  # PG 16
pig ext install -y plr -v 15  # PG 15
pig ext install -y plr -v 14  # PG 14
dnf install -y plr_18       # PG 18
dnf install -y plr_17       # PG 17
dnf install -y plr_16       # PG 16
dnf install -y plr_15       # PG 15
dnf install -y plr_14       # PG 14
apt install -y postgresql-18-plr   # PG 18
apt install -y postgresql-17-plr   # PG 17
apt install -y postgresql-16-plr   # PG 16
apt install -y postgresql-15-plr   # PG 15
apt install -y postgresql-14-plr   # PG 14

创建扩展

CREATE EXTENSION plr;

用法

plr: 加载 R 解释器并在数据库中执行 R 脚本

plr 允许在 PostgreSQL 中使用 R 编程语言编写函数,提供对 R 统计和数据分析功能的完整访问。

CREATE EXTENSION plr;

创建函数

CREATE OR REPLACE FUNCTION r_max(integer, integer) RETURNS integer AS '
if (arg1 > arg2)
  return(arg1)
else
  return(arg2)
' LANGUAGE plr STRICT;

SELECT r_max(10, 20);  -- 20

使用命名参数:

CREATE OR REPLACE FUNCTION sd(vals float8[]) RETURNS float AS '
sd(vals)
' LANGUAGE plr STRICT;

SELECT sd(ARRAY[1.0, 2.0, 3.0, 4.0, 5.0]);

参数处理

  • 参数以 arg1arg2 等形式或按命名参数方式访问
  • NULL 参数变为 R 的 NA 值(除非函数声明为 STRICT
  • 复合类型(行)以 R data.frame 形式传递
  • 数组以 R 向量形式传递
CREATE OR REPLACE FUNCTION r_max(integer, integer) RETURNS integer AS '
if (is.null(arg1) && is.null(arg2))
  return(NULL)
if (is.null(arg1))
  return(arg2)
if (is.null(arg2))
  return(arg1)
if (arg1 > arg2)
  return(arg1)
return(arg2)
' LANGUAGE plr;

通过 SPI 访问数据库

CREATE OR REPLACE FUNCTION test_spi(text) RETURNS SETOF record AS '
pg.spi.exec(arg1)
' LANGUAGE plr;

SELECT * FROM test_spi('SELECT oid, typname FROM pg_type LIMIT 5')
  AS t(oid oid, typname name);

预备语句:

-- 预备
sp <<- pg.spi.prepare('SELECT * FROM pg_type WHERE typname = $1', c(NAMEOID))
-- 执行
pg.spi.execp(sp, list('text'))

集合返回函数

返回 data.frame 以实现集合返回函数:

CREATE OR REPLACE FUNCTION get_numbers(n int) RETURNS SETOF integer AS '
1:arg1
' LANGUAGE plr;

SELECT * FROM get_numbers(5);

窗口函数

CREATE OR REPLACE FUNCTION r_regr_slope(float8, float8, int)
RETURNS float8 AS '
slope <- NA
y <- farg1
x <- farg2
if (fnumrows == arg3 + 1L)
  try(slope <- lm(y ~ x)$coefficients[2])
return(slope)
' LANGUAGE plr WINDOW;

窗口函数接收 farg1..fargN(窗口帧内的值向量)、fnumrows(帧大小)和 prownum(分区中的当前行位置)。

全局变量

使用 R 的全局环境在函数调用之间保持数据:

CREATE OR REPLACE FUNCTION set_state(key text, val text) RETURNS void AS '
assign(arg1, arg2, env=.GlobalEnv)
' LANGUAGE plr;

实用辅助函数

SELECT load_r_typenames();  -- 加载类型 OID 变量
SELECT * FROM r_typenames(); -- 列出可用的类型 OID
SELECT plr_version();        -- PL/R 版本

触发器函数

PL/R 支持触发器函数,可以访问 pg.tg.namepg.tg.relnamepg.tg.whenpg.tg.levelpg.tg.oppg.tg.newpg.tg.old


最后修改 2026-03-21: routine extension update (0532370)