我创建了以下函数来截断以“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();
答案 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
。请注意细微差别:
相关答案以及更多解释: