PostgreSQL plpgsql如何在函数内返回另一被调函数的返回值
错误原因
PL/pgSQL 不允许执行无接收目标的 SELECT 语句,你写的两个函数都存在该问题:
bar()函数中直接写select md5(random()::text);,没有将查询结果赋值给变量或直接返回foo()函数中return后直接跟select bar()不符合语法规范,return后需要跟标量表达式,不能直接接查询语句
最简修复方案
直接去掉多余的 SELECT 语句,直接返回表达式或函数调用结果即可:
create or replace function bar () returns text as $$ begin return md5(random()::text); end $$ language plpgsql; create or replace function foo () returns text as $$ begin return bar(); end $$ language plpgsql;
如果你确实需要使用 SELECT 语句获取结果
可以用 SELECT ... INTO 语法先将查询结果存入变量,再返回变量:
create or replace function bar () returns text as $$ declare v_result text; begin select md5(random()::text) into v_result; return v_result; end $$ language plpgsql;
如果要在返回语句中嵌套查询,需要将查询语句用括号包裹,将其转为标量值:
create or replace function foo () returns text as $$ begin return (select bar()); end $$ language plpgsql;
额外优化点
- 声明函数语言时不需要加单引号,
language plpgsql是标准写法,旧版本兼容加引号的写法但不推荐 - 只有返回结果集的场景才需要用到
RETURN QUERY接查询语句,返回单个标量值不需要用该语法
内容的提问来源于stack exchange,提问作者francistheturd
相关产品推荐
相关产品推荐

