Обрезать все таблицы в базе данных postgres

#postgresql

#postgresql

Вопрос:

В мае 2010 года Аарон и Хеннинг оба предоставили код для регистрации функции, которая при последующем вызове с параметром ‘username’ выполняла обрезку всех таблиц. Это отлично работало с postgres в Windows 7. К сожалению, ни то, ни другое не будет работать с postgres 8.3 в Ubuntu.

 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,
удалив сложное предложение 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;                           
  

Комментарии:

1. $ 1 не отображается в заключенной в кавычки частичной функции, поэтому вы вырезали важную информацию. Пожалуйста, предоставьте полную функцию create;

Ответ №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) ||' CASCADE;';
    END LOOP;
END;
$$ LANGUAGE plpgsql;