PostgreSQL自定义fn_split函数报错求助:语法错误at or near 'elems'
问题分析与解决
语法错误原因
- 重复声明变量:函数参数已定义
delimeter,DECLARE段再次声明该变量,引发命名冲突。 - 语句缺少分号:
SELECT ... INTO elems语句末尾未加分号,PostgreSQL无法识别语句结束,导致后续RETURN语句触发语法错误。 - 错误赋值逻辑:
unnest()会将数组拆分为行集合,直接赋值给数组类型变量elems不符合语法,无需使用unnest(),直接用string_to_array()的结果赋值即可。 - 冗余变量:
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
相关产品推荐
相关产品推荐

