Динамически генерируемое имя таблицы в команде PostgreSQL COPY - PullRequest
6 голосов
/ 04 февраля 2011

Эта команда PostgreSQL COPY работает:

copy tablename from E'c:\\abc\\a.txt';

но я хочу, чтобы имя таблицы создавалось динамически. Как я могу это сделать?

1 Ответ

14 голосов
/ 12 марта 2011

Вам нужно построить строку, объединить в динамическое имя таблицы, а затем использовать команду 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

...