2011-02-04 3 views

ответ

14

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

+3

Ваш пример кода на самом деле демонстрирует имя-файла динамически генерируется, а не имя-таблицы динамически генерируемой. Кроме того, вы не упомянули, что ваш пример-код указывает вывод с разделителями-запятыми, а не вывод по умолчанию с разделителями табуляции. (Скопировали ли вы примерный код из другого места?) – ruakh

+0

Руах, спасибо, что указали на ошибку. Теперь отредактирован с именем dyanmic и именем файла. Да, это очень упрощенная версия того, что я использую на работе - я буду более осторожен в будущем, чтобы правильно ответить на вопрос. –

+0

Иисус Христос, мне потребовалось некоторое время, чтобы выяснить опечатку в quot_ident! На самом деле это quotE_ident! Теперь это имеет смысл: «pg_execute(): Query failed: ERROR: 42883: function quot_ident (текст) не существует» – zapadlo

Смежные вопросы