截断postgres数据库中的所有表

时间:2011-04-25 20:20:12

标签: postgresql

2010年5月,Aaron和Henning都提供了注册函数的代码,稍后使用'username'参数调用该函数会截断所有表。它适用于Windows 7上的postgres。不幸的是,对于Ubuntu上的postgres 8.3,它们都不会有效。

An error has occurred:
ERROR:  syntax error at or near "$1"
LINE 1:   $1 
          ^
QUERY:    $1 
CONTEXT:  SQL statement in PL/PgSQL function "truncate_tables" near line 6

我也尝试过简化select语句以专注于BEGIN For子句, 删除我在Windows中使用的复杂WHERE子句 你能在这看到问题吗?谢谢。 它们被检索后无法传递或读取表名吗? $ 1的问题是不是意味着找不到它的输入?

DECLARE 
    stmt RECORD;  
    statements CURSOR FOR  
    SELECT tablename FROM pg_tables  
    WHERE  tablename !~* 'sql_*' and tablename !~* 'pg_*' and tablename !~* 'schema_*';  
BEGIN  
    FOR stmt IN statements LOOP  
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ' CASCADE;';  
    END LOOP;  
END;                           

1 个答案:

答案 0 :(得分:1)

似乎某些功能语法在版本8.3和8.4之间发生了变化。试试这个:

CREATE OR REPLACE FUNCTION public.truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    stmt RECORD;
BEGIN
    FOR stmt IN SELECT tablename FROM pg_tables
        WHERE tableowner = username AND schemaname = 'public' LOOP
        execute 'TRUNCATE TABLE public.' || quote_ident(stmt.tablename) ||';';
    END LOOP;
END;
$$ LANGUAGE plpgsql;