我正在尝试创建一个函数来动态创建表备份。
但我得到的错误像:
错误:在"处或附近出现语法错误
这是我正在尝试的一种方法:
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()
函数的占位符。
在线示例