postgresql - 错误 PostgreSQL:RETURN 必须在函数返回行中指定记录或行变量
问题描述
我正在尝试运行这些行:
create type _stats_agg_result_type AS (
count bigint,
min double precision,
max double precision,
mean double precision,
variance double precision,
skewness double precision,
kurtosis double precision
);
create or replace function _stats_agg_finalizer(_stats_agg_accum_type)
returns _stats_agg_result_type AS '
BEGIN
RETURN row(
$1.n,
$1.min,
$1.max,
$1.m1,
$1.m2 / nullif(($1.n - 1.0), 0),
case when $1.m2 = 0 then null else sqrt($1.n) * $1.m3 / nullif(($1.m2 ^ 1.5), 0) end,
case when $1.m2 = 0 then null else $1.n * $1.m4 / nullif(($1.m2 * $1.m2) - 3.0, 0) end
);
END;
'
language plpgsql;
不幸的是,我收到以下错误(_stats_agg_finalizer
函数):
RETURN must specify a record or row variable in function returning row
我正在运行的版本:
PostgreSQL 9.2.24 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
我是 PostgreSQL 新手,我无法修复此错误。感谢任何帮助,谢谢!
解决方案
这是在 9.3 中启用的。我认为它对应于此发行说明:
允许 PL/pgSQL 使用带有复合类型表达式的 RETURN (Asif Rehman)
以前,在返回复合类型的函数中,RETURN 只能引用该类型的变量。
所以你应该可以这样重写它:
create or replace function _stats_agg_finalizer(_stats_agg_result_type)
returns _stats_agg_result_type AS '
declare f _stats_agg_result_type ;
BEGIN
f:=row(
$1.n,
$1.min,
$1.max,
$1.m1,
$1.m2 / nullif(($1.n - 1.0), 0),
case when $1.m2 = 0 then null else sqrt($1.n) * $1.m3 / nullif(($1.m2 ^ 1.5), 0) end,
case when $1.m2 = 0 then null else $1.n * $1.m4 / nullif(($1.m2 * $1.m2) - 3.0, 0) end
);
return f;
END;
'
language plpgsql;
请注意,我更改了输入类型,因为您没有显示使用原始类型的定义。
推荐阅读
- r - 如何使用 ggplot 更改 x 轴
- django - Django Form 没有引发 ValidationError
- c# - SQLite 内存数据库使用时态表测试 EF Core 应用程序
- java - 一个类调用另一个类的方法
- c - `lseek` 如何帮助确定文件是否为空?
- sql - 如何在单行表中插入多行?
- python - 在 PEX 中使用 python 脚本执行时出现 pyyaml 依赖错误
- sql - SQL Oracle中字符串列表中的条件计数
- python - 尝试使用 users.nitro discord.py 时出错
- python - JSONDecodeError:期望值:第 1 行第 1 列(字符 0)Django rest_framework