#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;