PostgreSQL多态数组函数开发:生成指定位置赋值数组及相关疑问
解决PL/pgSQL多态数组函数问题
你的原函数无法运行的核心问题是:array_fill(null, array[n])生成的数组没有明确的元素类型,而null本身是无类型的,PostgreSQL无法将其与输入参数v的anyelement类型做兼容匹配,导致后续赋值操作失败。
修正后的函数代码
CREATE OR REPLACE FUNCTION arraycol(v anyelement, n int, i int) RETURNS anyarray LANGUAGE plpgsql AS $$ DECLARE r anyarray; BEGIN -- 参数合法性校验 IF n <= 0 THEN RAISE EXCEPTION '数组维度大小n必须大于0'; END IF; IF i < 1 OR i > n THEN RAISE EXCEPTION '索引i必须在1到%之间', n; END IF; -- 创建与v同类型的NULL数组 r := array_fill(null::typeof(v), ARRAY[n]); -- 为指定索引赋值 r[i] := v; RETURN r; END $$;
测试示例
- 调用
SELECT arraycol(123::int, 5, 3);,返回{NULL,NULL,123,NULL,NULL}(int类型数组) - 调用
SELECT arraycol('test'::text, 4, 1);,返回{test,NULL,NULL,NULL}(text类型数组)
你的问题解答
是否可以让该函数返回多态数组类型?
完全可以。PostgreSQL的anyarray就是专门的多态数组类型,它会自动根据输入参数v的anyelement类型推断返回数组的元素类型,实现不同类型数组的动态返回。是否可以创建多态元素类型的变量?
当然可以。你可以直接用anyelement声明变量(比如DECLARE elem anyelement;),也可以用typeof(v)关联输入参数的类型(比如DECLARE elem typeof(v);),变量的类型会随输入参数的类型动态变化,满足多态元素的需求。
内容的提问来源于stack exchange,提问作者George Kourtis
相关产品推荐
相关产品推荐

