Вам нужно построить строку, объединить в динамическое имя таблицы, а затем использовать команду execute. Обратите внимание, что вы избегаете «по». Это также включает динамическое имя для сохранения файла. Вам нужно заменить saveir на тот каталог, который вы используете.
CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS $$
DECLARE STATEMENT TEXT;
BEGIN
STATEMENT := 'COPY (select * from ' || quote_ident(tablename) || ') to ''savedir' || outname ||'.txt''';
EXECUTE STATEMENT;
END;
$$ LANGUAGE 'plpgsql';
EDIT:
С тех пор, как я впервые написал это, я обнаружил функцию форматирования, которая, как мне кажется, обычно легче читать, чем SQL, сгенерированный с помощью оператора конкатенации || и более гибкий.
CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS
$BODY$
BEGIN
EXECUTE FORMAT('COPY (SELECT * FROM %s) TO ''savedir%s.csv''',
tablename,
outname);
END
$BODY$
LANGUAGE plpgsql;
См. Официальные документы для полного обсуждения: https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN