无法通过 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()
函数的占位符。
我正在尝试创建一个函数来动态创建 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()
函数的占位符。