You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL自定义fn_split函数报错求助:语法错误at or near 'elems'

问题分析与解决

语法错误原因

  1. 重复声明变量:函数参数已定义delimeter,DECLARE段再次声明该变量,引发命名冲突。
  2. 语句缺少分号:SELECT ... INTO elems语句末尾未加分号,PostgreSQL无法识别语句结束,导致后续RETURN语句触发语法错误。
  3. 错误赋值逻辑:unnest()会将数组拆分为行集合,直接赋值给数组类型变量elems不符合语法,无需使用unnest(),直接用string_to_array()的结果赋值即可。
  4. 冗余变量:var和arr_len变量未被使用,可删除以简化代码。

修正后的函数代码

方案1:返回数组类型(匹配原函数返回定义)

CREATE OR REPLACE FUNCTION public.fn_split(
    inputstr text,
    delimeter text)
    RETURNS text[]
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE SECURITY DEFINER PARALLEL UNSAFE
AS $BODY$
DECLARE
    elems text[];
BEGIN
    elems := string_to_array(inputstr, delimeter);
    RETURN elems;
END
$BODY$;

方案2:返回行集合(符合输出两行内容的直观需求)

如果需要直接返回拆分后的每一行数据,可将返回类型改为SETOF text:

CREATE OR REPLACE FUNCTION public.fn_split(
    inputstr text,
    delimeter text)
    RETURNS SETOF text
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE SECURITY DEFINER PARALLEL UNSAFE
AS $BODY$
BEGIN
    RETURN QUERY SELECT unnest(string_to_array(inputstr, delimeter));
END
$BODY$;

使用示例

调用方案2的函数,输入指定字符串和分隔符;:

SELECT public.fn_split('we@@@ty;rer@@2hjjj', ';');

输出结果:

fn_split
----------
we@@@ty
rer@@2hjjj

内容的提问来源于stack exchange,提问作者KSMNOP k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 05:06:27