我是 PostGRES 新手,我正在尝试创建将多个表中的数据插入到单个临时表中的代码。
所有源表的名称都以“B3_HIST_”开头,仅年份不同(它们的名称从“B3_HIST_2015”到“B3_HIST_2023”)
我尝试创建3个变量:nametab(VARCHAR,“B3_HIST_”),startyr(INTEGER,“2015”)和lastyr(INTEGER,“2024”)并使用循环连接它们,如下所示:
create or replace procedure dbo.SP_B3_HIST ()
language plpgsql
AS $$
declare
nametab TEXT := 'dbo.B3_HIST_';
startyr INTEGER := 2015;
lastyr INTEGER := 2023;
begin
while startyr <= lastyr loop
INSERT INTO TEMP1 SELECT * FROM (nametab || startyr )
startyr = startyr + 1
END LOOP;
END; $$
问题:
错误:美元之间的字符串未以“$$”或附近结尾 宣布 名称表文本 := 'dbo.B3_HIST_'" 第 3 行:AS$$ ^
对此有什么想法吗?
您可以循环为每个源表运行单独的
INSERT
。 (就像大桌子和每张桌子后面的COMMIT
?)
通常构建单个语句(使用纯 SQL)并执行更简单、更快:
CREATE OR REPLACE PROCEDURE dbo.sp_b3_hist()
LANGUAGE plpgsql AS
$proc$
DECLARE
nametab text := 'dbo.b3_hist_'; -- lower case
startyr int := 2015;
lastyr int := 2023;
BEGIN
-- RAISE NOTICE '%', ( -- debug first?
EXECUTE (
SELECT E'INSERT INTO temp1 \n'
|| string_agg('TABLE ' || nametab || g, E'\nUNION ALL ')
FROM generate_series(startyr, lastyr) g
);
END
$proc$;
CALL dbo.sp_b3_hist();
如果是一次性操作,请使用
DO
命令而不是持久化过程。
或者在 psql 中使用
\gexec
。
参见:
避免在 Postgres 中混合大小写标识符,让您的生活更轻松。