美元之间的字符串未在“$$ statements nametab TEXT := 'dbo.B3_HIST_'”第 3 行中或附近结尾:AS$$ ^

问题描述 投票:0回答:1

我是 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$$ ^

对此有什么想法吗?

postgresql
1个回答
0
投票

可以循环为每个源表运行单独的

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 中混合大小写标识符,让您的生活更轻松。

© www.soinside.com 2019 - 2024. All rights reserved.