PostgreSQL如何将存储过程返回的数据插入到新表中
问题原因
- 你使用的
exec是SQL Server的存储过程调用语法,PostgreSQL不支持该关键字,这是你触发语法报错的直接原因。 - 更核心的逻辑问题是:你当前编写的PL/pgSQL存储过程里仅执行了
SELECT语句,不会把查询的结果集返回给调用方,即使语法修正也无法直接拿到结果插入到Customer表。
解决方案
方案1:无需存储过程,直接执行插入(推荐,最简洁)
如果没有必须封装为存储过程的要求,直接通过查询插入即可完成需求:
- 若Customer表已存在:
INSERT INTO public.Customer SELECT * FROM public.customer_list;
- 若Customer表还未创建,可一步完成建表+数据插入:
CREATE TABLE public.Customer AS SELECT * FROM public.customer_list;
方案2:改写为返回结果集的函数后插入
如果需要把查询逻辑封装复用,可以把存储过程改为返回结果集的函数:
- 改写函数代码:
CREATE OR REPLACE FUNCTION test() -- 此处直接复用视图customer_list的行结构,也可自定义列结构:RETURNS TABLE(列名1 类型, 列名2 类型...) RETURNS SETOF public.customer_list LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT * FROM public.customer_list; END; $$;
- 执行插入语句:
INSERT INTO public.Customer SELECT * FROM test();
方案3:把插入逻辑直接封装到存储过程中
如果必须使用存储过程实现,可以直接把插入逻辑写在存储过程内部,调用时直接执行即可:
- 改写存储过程代码:
CREATE OR REPLACE PROCEDURE test() LANGUAGE plpgsql AS $$ BEGIN INSERT INTO public.Customer SELECT * FROM public.customer_list; END; $$;
- 调用存储过程执行插入:
CALL public.test();
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

