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



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

但我得到的错误像:

错误:在"处或附近出现语法错误

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

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()

我不明白,为什么execute语句会给我这样的错误。

我建议简化代码,并使用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;

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

在线示例

最新更新