PostgreSQL COPY命令中动态生成的表名

kal*_*lem 6 postgresql plpgsql

这个PostgreSQL COPY命令有效:

copy tablename from E'c:\\abc\\a.txt';
Run Code Online (Sandbox Code Playgroud)

但我希望动态生成tablename.我怎样才能做到这一点?

Joh*_*ell 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';
Run Code Online (Sandbox Code Playgroud)

编辑:

自从我第一次写这篇文章以来,我发现了格式函数,我认为通常比使用串联运算符||生成的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;
Run Code Online (Sandbox Code Playgroud)

有关完整讨论,请参阅官方文档:https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

  • 您的示例代码实际上演示了动态生成的文件名,而不是动态生成的表名.另外,您没有提到您的示例代码指定了逗号分隔的输出,而不是默认的制表符分隔输出.(您是否从其他地方复制了示例代码?) (3认同)