PostgreSQL PL/pgSQL中不能用ARRAY关键字声明数组变量,正确方式是用类型后缀[](如INT[])并在DECLARE段用:='{}'初始化,或在BEGIN块中用:= ARRAY[...]赋值。

PostgreSQL存储过程里不能用ARRAY关键字直接声明数组变量
PostgreSQL的PL/pgSQL中,ARRAY不是变量声明关键字,也不是类型构造符(像INT[]那样),它只是用于字面量或函数返回值的语法糖。你写DECLARE arr ARRAY := ARRAY[1,2,3];会报错:ERROR: syntax error at or near "ARRAY"——因为PL/pgSQL的DECLARE段不支持这种写法。
正确声明数组变量:用类型后缀[]或TYPE[]
PL/pgSQL要求显式指定数组元素类型,并用方括号[]表示维度。常见写法包括:
-
my_ints INT[];—— 声明空数组变量(初始值为NULL) -
my_texts TEXT[] := '{}';—— 声明并初始化为空数组(注意花括号{},不是[]) -
my_dates DATE[] := ARRAY['2024-01-01'::DATE, '2024-01-02'];—— 用ARRAY字面量赋值(仅限赋值语句,不能用于DECLARE)
注意::= ARRAY[...]只能出现在BEGIN ... END块内,不能放在DECLARE段;而:= '{}'是唯一允许在DECLARE段初始化数组的方式。
常见错误:混淆ARRAY字面量、构造函数和类型声明
以下写法都会出错:
-
arr ARRAY := '{1,2}';——ARRAY不是类型名,PL/pgSQL不认识 -
arr INT ARRAY;—— 语法非法,顺序和符号都不对 -
arr INT[] := [];——[]不是合法字面量,必须用{}或ARRAY[...] -
arr TEXT[] := 'a,b';—— 字符串不会自动转数组,需用string_to_array('a,b', ',')
真正安全的初始化方式只有两种::= '{}'(空数组)或在BEGIN中用arr := ARRAY[...];或arr := string_to_array(...);。
多维数组和嵌套场景下要注意维度一致性
PL/pgSQL支持多维数组,但所有子数组长度必须一致(否则运行时报array must have same dimensions)。例如:
DO $$ DECLARE matrix INT[][] := ARRAY[[1,2], [3,4]]; -- ✅ 合法:2×2 broken INT[][] := ARRAY[[1,2], [3]]; -- ❌ 运行时报错:维度不匹配 BEGIN RAISE NOTICE '%', matrix; END $$;
另外,ARRAY字面量默认推导类型为TEXT[],若含混合类型(如ARRAY[1, 'a']),会强制转成TEXT[],可能引发隐式转换意外。明确类型更稳妥:ARRAY[1,2]::INT[]。
数组索引从1开始,越界访问不报错但返回NULL,容易掩盖逻辑错误——检查array_length(arr, 1)比盲目取arr[10]更可靠。

















