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

如何在PostgreSQL中执行存储过程返回的SQL字符串

报错原因

你尝试的EXECUTE QUERY CALL和EXECUTE CALL写法不符合PostgreSQL语法规则:EXECUTE是PL/pgSQL专属语句,仅能在存储过程、函数、匿名DO代码块内部使用,不能直接在顶层SQL上下文调用,也无法直接嵌套CALL语句。

实现方案(仅使用存储过程,无需调整为函数)

方案1:无需修改现有存储过程,通过匿名块中转执行

DO $$
DECLARE
    -- 定义变量接收存储过程返回的SQL字符串
    returned_sql text;
BEGIN
    -- 调用存储过程赋值
    CALL dbo.select_users_test(returned_sql);
    -- 执行返回的SQL,若需要保留查询结果可存入临时表
    CREATE TEMP TABLE temp_user_result ON COMMIT PRESERVE ROWS AS
    EXECUTE returned_sql;
END $$;

-- 直接查询临时表获取SQL执行结果
SELECT * FROM temp_user_result;

方案2:修改存储过程内部逻辑,直接完成SQL执行

如果不需要把SQL字符串返回给外部再执行,可以直接在存储过程内完成执行逻辑:

-- 调整后的存储过程
CREATE OR REPLACE PROCEDURE dbo.select_users_and_exec()
LANGUAGE plpgsql
AS
$$
DECLARE
    v_sql text := 'select * from dbo.user where usr_key in (1, 2);';
BEGIN
    -- 内部执行SQL,结果存入临时表
    DROP TABLE IF EXISTS temp_user_result;
    CREATE TEMP TABLE temp_user_result AS
    EXECUTE v_sql;
END;
$$;

-- 调用后直接查询结果
CALL dbo.select_users_and_exec();
SELECT * FROM temp_user_result;

内容的提问来源于stack exchange,提问作者Fakhar Ahmad Rasul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:54:03