Postgresql COPY 命令 - 如何删除临时文件?

Postgresql COPY command - how to delete temp file?

我有程序,效果很好。

CREATE OR REPLACE FUNCTION f_dynamic_copy(_tbl     text = 'tmp1')
RETURNS void AS
$func$
DECLARE
   _filename VARCHAR;
BEGIN
  _filename := '/tmp/' || random() || '.csv';
  EXECUTE format($$COPY (select id, 1, 1, 1 from my_first_table) TO %L$$, _filename);
  EXECUTE format($$COPY my_second_table FROM %L$$, _filename);
END
$func$  LANGUAGE plpgsql;

但我想删除在此过程中创建的临时文件。怎么做?

plpgsql没有删除文件的功能。您需要在 perl 或 python 中创建存储函数才能删除临时文件。但是你真的需要一个临时文件吗 INSERT SELECT 做这个工作就像需要一个存储函数一样好吗?

INSERT INTO my_second_table SELECT id, 1, 1, 1 from my_first_table

我找到了 PostgreSQL 9.3+ 的解决方案:

-- Delete temporary file
EXECUTE format(
  $$COPY (SELECT 1) TO PROGRAM 'rm %I'$$,
  _filename
);

所以,我的功能是

CREATE OR REPLACE FUNCTION f_dynamic_copy(_tbl     text = 'tmp1')
RETURNS void AS
$func$
DECLARE
   _filename VARCHAR;
BEGIN
  _filename := '/tmp/' || random() || '.csv';
  EXECUTE format($$COPY (select id, 1, 1, 1 from my_first_table) TO %L$$, _filename);
  EXECUTE format($$COPY my_second_table FROM %L$$, _filename);

  -- Delete temporary file
  EXECUTE format(
    $$COPY (SELECT 1) TO PROGRAM 'rm %I'$$,
    _filename
  );

END
$func$  LANGUAGE plpgsql;