在PostgreSQL数据库中截断所有表

3

2010年5月,Aaron和Henning提供了注册函数的代码。当以后用“用户名”参数调用该函数时,它将截断所有表格。在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

我也尝试简化选择语句,将重点放在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在引用的部分函数中没有出现,因此您已经省略了关键信息。请提供完整的create函数。 - undefined
1个回答

3

看起来在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) ||' CASCADE;';
    END LOOP;
END;
$$ LANGUAGE plpgsql;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接