You need to enable JavaScript to run this app. PostgreSQL plpgsql如何在函数内返回另一被调函数的返回值
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 19:54:02