PL/pgSQL中如何声明带指定列名的行字面量数组?
错误原因
你这段代码的语法错误来自两个问题:
- PostgreSQL 不支持
gangwei(col1, col2)[]这种直接取表字段子集声明复合类型数组的语法 - PL/pgSQL 变量赋值时不能直接使用裸写的
{('fo1','bar1'),('fo2','bar2')}数组字面量,需要用ARRAY构造器或者加单引号转义
可行实现方案
方案1:使用匿名RECORD数组(推荐,适配应用层生成的字面量格式)
不需要提前自定义类型,直接构造行数组,unnest时指定列名即可:
DO $$ DECLARE bkgws RECORD[] := ARRAY[ROW('fo1','bar1'),ROW('fo2','bar2')]; BEGIN INSERT INTO gangwei (config_id, col1, col2) SELECT 1, col1, col2 FROM unnest(bkgws) AS t(col1, col2); END;$$;
如果是应用层直接生成的字符串格式数组,也可以直接转类型赋值:
DO $$ DECLARE bkgws RECORD[] := '{"(fo1,bar1)","(fo2,bar2)"}'::RECORD[]; BEGIN INSERT INTO gangwei (config_id, col1, col2) SELECT 1, col1, col2 FROM unnest(bkgws) AS t(col1, col2); END;$$;
方案2:强类型绑定(如果需要严格校验字段格式)
如果需要和gangwei表的字段类型严格绑定,可以声明为gangwei表类型数组,缺省字段自动取NULL:
DO $$ DECLARE bkgws gangwei[] := ARRAY[ (NULL, NULL, 'fo1','bar1')::gangwei, (NULL, NULL, 'fo2','bar2')::gangwei ]; BEGIN INSERT INTO gangwei (config_id, col1, col2) SELECT 1, col1, col2 FROM unnest(bkgws); END;$$;
内容的提问来源于stack exchange,提问作者tcpiper
相关产品推荐
相关产品推荐

