SQL Server迁移PostgreSQL存储过程报错:ProcesoGeneral引用歧义
解决PostgreSQL存储过程列名歧义错误
错误原因
你遇到的SQL Error [42702]是因为存储过程的输入参数"ProcesoGeneral"和表"ProcesarInformacion"中的列名完全相同,PostgreSQL无法判断WHERE子句里的"ProcesoGeneral"究竟是指存储过程的参数还是表的列,因此抛出歧义错误。
解决方案
方案1:修改参数名避免冲突
直接给参数加前缀(比如p_),让参数名和列名区分开,修改后的代码如下:
CREATE OR REPLACE PROCEDURE public."ProcesarInformacionSP"(IN "p_ProcesoGeneral" character varying) LANGUAGE plpgsql AS $procedure$ BEGIN if("p_ProcesoGeneral" = 'R') then RETURN QUERY SELECT distinct "ProcesoInterno" FROM "ProcesarInformacion" where "ProcesoGeneral"= "p_ProcesoGeneral"; else RETURN QUERY SELECT "ProcesoInterno" FROM public."ProcesarInformacion" where "ProcesoGeneral"= "p_ProcesoGeneral" order by "Orden"; end if; END; $procedure$ ;
方案2:用冒号前缀明确引用参数
如果不想改参数名,在PL/pgSQL中可以给参数名加上冒号前缀:,明确表示这是存储过程的变量,而不是表列:
CREATE OR REPLACE PROCEDURE public."ProcesarInformacionSP"(IN "ProcesoGeneral" character varying) LANGUAGE plpgsql AS $procedure$ BEGIN if("ProcesoGeneral" = 'R') then RETURN QUERY SELECT distinct "ProcesoInterno" FROM "ProcesarInformacion" where "ProcesoGeneral"= :"ProcesoGeneral"; else RETURN QUERY SELECT "ProcesoInterno" FROM public."ProcesarInformacion" where "ProcesoGeneral"= :"ProcesoGeneral" order by "Orden"; end if; END; $procedure$ ;
额外提示
原代码中的SELECT语句在PostgreSQL存储过程中默认不会返回结果,需要加上RETURN QUERY才能让调用者获取到查询结果集,上面的两种方案都已经补全了这个部分。
内容的提问来源于stack exchange,提问作者Noobmaster
相关产品推荐
相关产品推荐

