无法通过 PL/pgSQL 函数动态创建 table 的备份

Not able to create backup of table dynamically, through PL/pgSQL function

我正在尝试创建一个函数来动态创建 table 备份。

但我收到如下错误:

ERROR: syntax error at or near "'

这是我正在尝试的方法之一:

CREATE OR REPLACE FUNCTION public.test () RETURNS varchar AS
$BODY$ DECLARE backup_string varchar(50); 
BEGIN
backup_string = (SELECT '_'||LPAD(DATE_PART('DAY',CURRENT_DATE)::VARCHAR,2,'0')||DATE_PART('MONTH',CURRENT_DATE)::VARCHAR||DATE_PART('YEAR',CURRENT_DATE)::VARCHAR||'_1');

EXECUTE 'SELECT  * INTO table_name'|| backup_string ||' FROM table_name';

RETURN 'Y';
EXCEPTION WHEN others THEN RETURN 'N'; 
END
    ; $BODY$
LANGUAGE 'plpgsql'
GO
SELECT * FROM test()

我不明白,为什么那个执行语句给我这样的错误。

我建议简化您的代码并使用 format() 函数生成动态 SQL。这样你就可以避免连接产生的混乱,你可以专注于实际的 SQL 代码。除此之外,它还可以正确处理可能需要引用的标识符。

在处理动态 SQL 时,将生成的 SQL 语句存储在变量中始终是个好主意,这样在出现错误时可以打印出来以供调试之用。看生成的SQL一般就知道生成代码哪里出错了

CREATE OR REPLACE FUNCTION test() 
  RETURNS varchar 
AS
$BODY$ 
DECLARE 
  l_source_table text;
  l_backup_table text; 
  l_sql text;
BEGIN
  l_source_table := 'table_name';
  l_backup_table := l_source_table||'_'||to_char(current_date, 'ddmmyyyy')||'_1';
  l_sql := format('create table %I as select * from %I', l_backup_table, l_source_table);

  -- for debugging purposes:
  raise notice 'Running: %', l_sql

  EXECUTE l_sql;
  RETURN 'Y';
EXCEPTION 
  WHEN others THEN RETURN 'N'; 
END; 
$BODY$
LANGUAGE plpgsql;

请注意,我还为源和备份使用了变量 table,以便能够将其用作 format() 函数的占位符。

Online example