PostgreSQL报错:循环行的循环变量需为记录或标量变量列表
问题解决:PostgreSQL存储过程循环变量错误
错误原因
PostgreSQL中,使用FOR ... IN (SELECT ...)遍历查询结果时,循环变量必须是记录类型(RECORD)或者标量变量列表。你的代码未声明IDX的类型,数据库无法识别其为记录类型,因此抛出错误。
解决方案
有两种可行的修改方式:
方式1:声明循环变量为RECORD类型
在存储过程的DECLARE块中添加IDX的类型声明,示例如下:
DECLARE IDX RECORD; -- 声明为记录类型 -- 其他变量(如P_SUC_FLAG、P_ERROR等)的声明... BEGIN -- 其他业务代码... FOR IDX IN (SELECT * FROM CUSTINQRESPACDTL WHERE ENTITY_NUM = '1' AND CUST_ID = P_CUST_CODE AND SRV_REF_NUM = (SELECT MAX(SRV_REF_NUM) FROM CUSTINQRESPACDTL WHERE ENTITY_NUM = '1' AND CUST_ID = P_CUST_CODE) AND SCHEME_TYPE IN ('SBA', 'CAA', 'ODA')) LOOP IF TRIM(P_BEN_AC_NUM) = IDX.ACC_NUM THEN P_SUC_FLAG := 'F'; P_ERROR := 'BENREG023'; END IF; END LOOP; -- 其他业务代码... END;
方式2:仅查询需要的字段(更高效)
由于你的逻辑只用到ACC_NUM字段,无需查询所有列,可以直接指定该字段,此时循环变量可隐式适配,或声明为对应标量类型:
-- 隐式使用记录类型(无需额外声明) FOR IDX IN (SELECT ACC_NUM FROM CUSTINQRESPACDTL WHERE ENTITY_NUM = '1' AND CUST_ID = P_CUST_CODE AND SRV_REF_NUM = (SELECT MAX(SRV_REF_NUM) FROM CUSTINQRESPACDTL WHERE ENTITY_NUM = '1' AND CUST_ID = P_CUST_CODE) AND SCHEME_TYPE IN ('SBA', 'CAA', 'ODA')) LOOP IF TRIM(P_BEN_AC_NUM) = IDX.ACC_NUM THEN P_SUC_FLAG := 'F'; P_ERROR := 'BENREG023'; END IF; END LOOP;
或者直接使用标量变量:
DECLARE V_ACC_NUM VARCHAR(100); -- 根据ACC_NUM实际字段类型定义长度 BEGIN FOR V_ACC_NUM IN (SELECT ACC_NUM FROM CUSTINQRESPACDTL WHERE ENTITY_NUM = '1' AND CUST_ID = P_CUST_CODE AND SRV_REF_NUM = (SELECT MAX(SRV_REF_NUM) FROM CUSTINQRESPACDTL WHERE ENTITY_NUM = '1' AND CUST_ID = P_CUST_CODE) AND SCHEME_TYPE IN ('SBA', 'CAA', 'ODA')) LOOP IF TRIM(P_BEN_AC_NUM) = V_ACC_NUM THEN P_SUC_FLAG := 'F'; P_ERROR := 'BENREG023'; END IF; END LOOP; END;
内容的提问来源于stack exchange,提问作者KSMNOP k
相关产品推荐
相关产品推荐

