PostgreSQL 13创建含临时表的存储过程报错:temp不是已知变量
问题分析与解决方案
错误原因
在PostgreSQL的PL/pgSQL存储过程中,SELECT INTO的语法逻辑和纯SQL环境存在差异:
- 纯SQL场景下,
SELECT ... INTO TEMP TABLE ...是合法语句,用于创建临时表并插入查询结果; - 但在PL/pgSQL中,
SELECT INTO默认作用是给变量赋值,此时语句里的TEMP会被识别为一个未定义的变量名,因此触发"temp" is not a known variable的错误。
修复方案
有两种可行的修改方式:
方式1:使用CREATE TEMP TABLE ... AS SELECT(推荐)
这是PL/pgSQL中创建临时表并填充数据的标准写法,直接替换原有的SELECT INTO语句即可:
CREATE OR REPLACE PROCEDURE dbo.<proc-name>() LANGUAGE plpgsql AS $$ BEGIN DROP TABLE IF EXISTS child; -- 创建临时表并插入查询结果 CREATE TEMP TABLE child AS SELECT Id, Name FROM dbo.master; COMMIT; END; $$;
方式2:使用SELECT ... INTO TABLE语法
如果倾向于保留类似原语句的结构,可以明确指定INTO TABLE,告诉PL/pgSQL是将结果写入表而非变量:
CREATE OR REPLACE PROCEDURE dbo.<proc-name>() LANGUAGE plpgsql AS $$ BEGIN DROP TABLE IF EXISTS child; -- 先创建临时表结构 CREATE TEMP TABLE child (Id INT, Name VARCHAR); -- 将查询结果写入指定表 SELECT Id, Name INTO TABLE child FROM dbo.master; COMMIT; END; $$;
注意:这种方式需要先手动创建临时表的结构,否则会触发表不存在的错误。
内容的提问来源于stack exchange,提问作者Vikas J
相关产品推荐
相关产品推荐

