在PostgreSQL存储过程中使用SELECT INTO时目标表不被识别的问题
问题解决:PL/pgSQL存储过程中用SELECT INTO建表失败的问题
问题原因
在PL/pgSQL块中,SELECT INTO的作用是将查询结果赋值给变量,而非纯SQL环境中用来创建新表的语法。直接把表名写在INTO后面时,PL/pgSQL会将其识别为未声明的变量,抛出"not a known variable"错误;如果声明成varchar变量,只会把查询结果的单个值(若查询返回多行还会报错)赋值给变量,完全达不到建表目的。
解决方案
在PL/pgSQL存储过程中创建新表,应使用CREATE TABLE ... AS SELECT语法,这是正确的建表方式。
修改后的存储过程代码
create or replace procedure gla_first_step() language plpgsql as $$ begin -- 如需每次执行重建表,可取消下方注释(根据需求调整) -- DROP TABLE IF EXISTS TBL_bkmvdata_131_B110_L0; CREATE TABLE TBL_bkmvdata_131_B110_L0 AS select *, CASE WHEN B110TrialBalanceCodeText1406 LIKE N'%DATA%' OR B110TrialBalanceCodeText1406 LIKE '%EXPENSE%' OR B110TrialBalanceCodeText1406 LIKE '%INCOME%' THEN 'P' ELSE 'B' END as accountType from TBL_bkmvdata_131_B110; end; $$;
关键说明
- 语法替换:用
CREATE TABLE 新表名 AS SELECT ...替代原SELECT ... INTO 新表名 FROM ...,确保PL/pgSQL执行建表逻辑。 - CASE语句优化:原CASE条件存在重复判断(多次重复
LIKE N'%DATA%'),已简化为合并后的逻辑,效果一致且更简洁。 - 表存在处理:若需要每次执行存储过程都重建表,可取消注释
DROP TABLE IF EXISTS语句,避免因表已存在而报错。
内容的提问来源于stack exchange,提问作者SDido
相关产品推荐
相关产品推荐

