如何在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
相关产品推荐
相关产品推荐

