PostgreSQL PL/SQL代码故障排查:下拉选中行数据获取失败
代码问题排查与修复
核心问题点
- 循环变量未声明:
FOR循环中使用的v_idCandidato和v_numeroDaProva未在DECLARE段定义,PostgreSQL会抛出变量未定义的错误。 - 赋值逻辑错误:循环内直接用
"idCandidato"赋值,这会被解析为列名,但当前上下文未指定表别名,且正确做法应使用循环迭代出的变量给w_开头的变量赋值。 - JOIN条件存在歧义:
INNER JOIN的ON子句中,"idCandidato"和"idProcesso"未指定所属表,若多表存在同名列会直接报错,即使当前无同名列,这也是不规范的写法。
修复后的代码
do $$ DECLARE w_idCandidato int; w_numeroDaProva int; -- 补充循环变量声明 v_idCandidato int; v_numeroDaProva int; BEGIN FOR v_idCandidato, v_numeroDaProva IN SELECT pg."idCandidato", pg."numeroDaProva" FROM public."tb_provasGeradasProCandidato" AS pg -- 明确JOIN条件的表归属 INNER JOIN public."tb_candidatos" cd ON pg."idCandidato" = cd.id INNER JOIN public."tb_processosSeletivos" pr ON pg."idProcesso" = pr.id WHERE cd.id = 27 LOOP -- 使用循环迭代变量完成赋值 w_idCandidato := v_idCandidato; w_numeroDaProva := v_numeroDaProva; -- 可选:添加输出语句验证结果 -- RAISE NOTICE 'Candidato ID: %, Número da Prova: %', w_idCandidato, w_numeroDaProva; END LOOP; END; $$
额外说明
- 原代码的循环逻辑会让
w_变量最终只保留查询结果的最后一行值,若需要收集所有匹配数据,建议改用数组或临时表存储。 - 取消注释
RAISE NOTICE语句后,运行代码可在控制台查看变量值,验证数据是否正确获取。
内容的提问来源于stack exchange,提问作者Cesar Azeredo
相关产品推荐
相关产品推荐

