2011-04-25 23 views
1

2010年5月,Aaron和Henning都提供了注册函数的代码,稍后使用'username'参数调用该函数会截断所有表。它在Windows 7上使用postgres可以很好地工作。对于Ubuntu上的postgres 8.3,这两种方法都不会令人遗憾。截断postgres数据库中的所有表

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语句通过消除复杂的WHERE子句我在Windows中被用来重点开始为子句, 。
你能在这里看到问题吗?谢谢。 检索后无法传递或读取表名? 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;       
+4

请告诉我们功能 – 2011-04-25 20:25:01

+0

$ 1不出现在所列出的部分功能** **充分的源代码,所以你切出的重要信息。请提供全功能创建; – 2011-05-19 05:44:41

回答

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;