PostgreSQL函数返回p_V_RESULT等输出参数为null的问题排查
问题根因分析
- 核心原因:同名变量作用域覆盖
函数头部已经定义了p_V_RESULT、p_V_ERROR_MSG两个OUT输出参数,但是你在DECLARE声明块中又重复定义了两个同名的局部变量:
在PL/pgSQL的变量作用域规则中,内层声明的局部变量优先级高于外层的参数/变量。你后续代码中所有的赋值操作、DECLARE -- 此处重复声明的局部变量会覆盖外层的OUT参数 p_V_RESULT char(1) := 'T'; p_V_ERROR_MSG varchar(1000) := NULL; -- 其他变量省略RAISE INFO打印操作,操作的都是这个内层局部变量,真正的OUT输出参数自始至终没有被赋值,所以调用函数时返回的就是OUT参数的初始默认值NULL。而日志里能打印出值是因为打印的是已经赋值的局部变量,两者完全是两套变量。 - 次要排查方向:调用方式错误
如果排除变量作用域问题,也有可能是你调用函数的方式没有正确接收OUT参数,比如错误使用标量接收多返回值的函数,或者调用语法不符合PostgreSQL多输出参数函数的调用规范。
修复方案
直接删除DECLARE块中重复声明的两个同名变量即可,OUT参数本身可以直接在函数体内读写,不需要二次声明:
-- 修复后的声明块 DECLARE errMsg text; errState text; errContext text; r_rec record;
修改后再调用函数,输出参数就可以正常返回赋值后的结果。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

