截断功能在postgres中不起作用

时间:2015-06-16 13:47:18

标签: postgresql plpgsql dynamic-sql ddl postgresql-8.4

我创建了以下函数来截断以“irm_gtresult”开头的一堆表。我的函数中没有语法错误,但该函数在运行时不会截断表。这可能有什么问题?

我的Postgres db版本是8.4。

create or replace function br()
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
row text;
BEGIN
 FOR row IN
select table_name from information_schema.tables where table_name ILIKE 'irm_gtresult%'
LOOP
EXECUTE 'TRUNCATE TABLE ' || row;
END LOOP;
END;
$$;

呼叫:

select br();

1 个答案:

答案 0 :(得分:1)

您的代码有效。我测试过,它在Postgres 9.4中适用于我 使用outdated and unsupported version 8.4(就像你添加的那样)可能是的问题。该版本太旧了,请考虑升级到当前版本。

但是,我有几点建议:

  • 请勿使用关键字row作为变量名称。
  • 您不需要循环,您可以在一个命令中TRUNCATE所有表。更快,更短。
  • 如果存在依赖关系,则可能需要添加CASCADE。注意效果。

CREATE OR REPLACE FUNCTION br()
  RETURNS void AS
$func$
BEGIN
   EXECUTE (
      SELECT 'TRUNCATE TABLE '
          || string_agg(format('%I.%I', schemaname, tablename), ',')
          || ' CASCADE'
      FROM   pg_tables t
      WHERE  tablename ILIKE 'irm_gtresult%'
      AND    schemaname = 'public'
      -- AND tableowner = 'postgres'  -- optionaly restrict to one user
      );
END
$func$  LANGUAGE plpgsql;

呼叫:

SELECT br();

我正在使用系统目录中的视图pg_tables。你也可以像你一样使用information_schema.tables。请注意细微差别:

相关答案以及更多解释: