【问题标题】:Not able to create backup of table dynamically, through PL/pgSQL function无法通过 PL/pgSQL 函数动态创建表备份
【发布时间】:2021-01-21 00:52:40
【问题描述】:

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

但我收到如下错误:

错误:“'”处或附近的语法错误

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

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

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

【问题讨论】:

  • 不相关,但是:可以使用backup_string := '_'||to_char(current_date, 'ddmmyyyy')||'_1';简化backup_string的生成
  • go 在 Postgres 中不是有效的 SQL 命令
  • 错误信息很奇怪,因为你的代码中根本没有双引号。尝试将 SQL 分配给一个变量,然后在执行之前使用raise notice“打印”它。这将有助于发现错误。
  • @a_horse_with_no_name op 用于引发警告:imgur.com/a/tMeGCd5 获得成功以引发警告,但是当我注释掉 EXECUTE 部分时,得到了同样的错误。
  • 按提示尝试CREATE TABLE AS here SELECT INTOplpgsql 中具有特殊/替代含义。

标签: postgresql function plpgsql dynamic-sql ddl


【解决方案1】:

我建议您简化代码并使用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() 函数的占位符。

Online example

【讨论】:

  • 完美:thumbsup:
猜你喜欢
  • 2017-12-10
  • 2018-02-10
  • 1970-01-01
  • 2012-05-21
  • 2017-02-20
  • 1970-01-01
  • 2012-08-12
  • 2014-07-18
  • 2018-02-25
相关资源
最近更新 更多