PostgreSQL中为UNNEST结果赋值变量报错,求解决方案
问题解决:PL/pgSQL变量赋值语法错误修正
错误原因分析
- 赋值语法违规:PL/pgSQL不支持
变量 := SELECT ...的赋值格式,这是直接触发语法错误的原因。 - 冗余函数调用:你的
fn_split函数已经返回text[]数组类型,UNNEST是用来将数组拆成行集的工具,而你需要的是数组变量,完全不需要调用UNNEST。 - 数组操作错误:代码中
W_SPLIT_MSG.COUNT写法错误,PostgreSQL数组没有COUNT属性,需使用专门的数组长度函数;同时数组索引应使用方括号[]而非圆括号()。
修正后的代码片段
-- 修正赋值语句,直接获取数组结果 W_SPLIT_MSG := fn_split('P_MAIL_ID',';'); RAISE NOTICE 'GOT HERE :% IS THE NEW VALUE',W_SPLIT_MSG; -- 用cardinality获取数组元素个数(PostgreSQL 9.4+支持) FOR I IN 1 .. cardinality(W_SPLIT_MSG) LOOP INSERT INTO EMAILSAFRCP (ENTITY_CODE, EMAIL_SEQ_NO, EMAIL_RCP_TYPE, EMAIL_DTL_SL, EMAIL_ID) VALUES (P_ENTITY_NUM, P_SEQ_NUM, 'T', I, W_SPLIT_MSG[I]); END LOOP;
关键修正点说明
- 变量赋值:直接用
变量 := 函数调用的形式即可,因为fn_split返回的就是你需要的数组类型。如果偏好SELECT语法,也可以写成:SELECT fn_split('P_MAIL_ID',';') INTO W_SPLIT_MSG; - 数组长度获取:
cardinality(W_SPLIT_MSG):直接获取数组总元素数,兼容一维和多维数组;array_length(W_SPLIT_MSG, 1):获取一维数组的长度(第二个参数指定数组维度)。
- 数组索引:PostgreSQL数组的索引必须使用方括号
[],原代码中的W_SPLIT_MSG(I)会被识别为函数调用,必须改为W_SPLIT_MSG[I]。
内容的提问来源于stack exchange,提问作者KSMNOP k
相关产品推荐
相关产品推荐

