You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 15:34:53