此PostgreSQL COPY命令有效:
copy tablename from E'c:\\abc\\a.txt';
但我希望动态生成tablename。我怎么能这样做?
答案 0 :(得分: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';
编辑:
自从我第一次写这篇文章以来,我发现了格式函数,我认为它通常比使用串联运算符||生成的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