2015-01-06 22 views
4

我想使用PostgreSQL截断模式中的所有表。它显示这个错误:在PostgreSQL中截断模式中的所有表

ERROR: relation "Building" does not exist 
CONTEXT: SQL statement "TRUNCATE TABLE "Building" CASCADE" 
PL/pgSQL function truncate_schema(character varying) line 15 at EXECUTE statement 

下面是我使用的功能:

CREATE OR REPLACE FUNCTION truncate_schema(schema IN VARCHAR) RETURNS void AS $$ 
DECLARE 
    statements CURSOR FOR 
     SELECT table_name FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' AND table_schema = schema; 
BEGIN 
    FOR stmt IN statements LOOP 
     EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_name) || ' CASCADE'; 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

如何做到这正常吗?

回答

6

尝试这样

CREATE OR REPLACE FUNCTION truncate_schema(_schema character varying) 
    RETURNS void AS 
$BODY$ 
declare 
    selectrow record; 
begin 
for selectrow in 
select 'TRUNCATE TABLE ' || quote_ident(_schema) || '.' ||quote_ident(t.table_name) || ' CASCADE;' as qry 
from (
    SELECT table_name 
    FROM information_schema.tables 
    WHERE table_type = 'BASE TABLE' AND table_schema = _schema 
    )t 
loop 
execute selectrow.qry; 
end loop; 
end; 
$BODY$ 
    LANGUAGE plpgsql 
+1

太棒了。它的工作原理。非常感谢 – Farook

+0

难道你不觉得在最后一行的末尾需要分号吗.. – itsji10dra

+1

谢谢,非常有帮助! –

2

这很可能是因为您没有在您的TRUNCATE语句中包含架构的名称,所以它正在寻找public架构中的表。

尝试改变TRUNCATE声明是这样的:

EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_schema) || '.' || 
    quote_ident(stmt.table_name) || ' CASCADE'; 

此外,东西要记住约CASCADE是,它会TRUNCATE具有外键关系,任何表表,其中可以包含该架构之外的表。

编辑响应从OP评论:

您还需要添加table_schema到查询背后statements所以它是EXECUTE语句中使用。

+0

感谢response.It正在一个又一个错误记录“语句”无场“TABLE_SCHEMA”。 – Farook

+0

当然,没问题。 – khampson