Это PostgreSQL COPY работает команда:Динамически генерируемые имя_таблицы в команде PostgreSQL COPY
copy tablename from E'c:\\abc\\a.txt';
но я хочу имя_таблицы быть динамически. Как я могу это сделать?
Это PostgreSQL COPY работает команда:Динамически генерируемые имя_таблицы в команде PostgreSQL COPY
copy tablename from E'c:\\abc\\a.txt';
но я хочу имя_таблицы быть динамически. Как я могу это сделать?
Вам нужно построить строку, объединив имя динамической таблицы, а затем использовать execute. Обратите внимание, что вы избегаете «by». Это также включает динамическое имя для сохранения файла. Вам нужно заменить savedir на фактический каталог, который вы используете.
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
Ваш пример кода на самом деле демонстрирует имя-файла динамически генерируется, а не имя-таблицы динамически генерируемой. Кроме того, вы не упомянули, что ваш пример-код указывает вывод с разделителями-запятыми, а не вывод по умолчанию с разделителями табуляции. (Скопировали ли вы примерный код из другого места?) – ruakh
Руах, спасибо, что указали на ошибку. Теперь отредактирован с именем dyanmic и именем файла. Да, это очень упрощенная версия того, что я использую на работе - я буду более осторожен в будущем, чтобы правильно ответить на вопрос. –
Иисус Христос, мне потребовалось некоторое время, чтобы выяснить опечатку в quot_ident! На самом деле это quotE_ident! Теперь это имеет смысл: «pg_execute(): Query failed: ERROR: 42883: function quot_ident (текст) не существует» – zapadlo