在PL / pgSQL中使用COPY之前检测源文件是否为空

时间:2018-04-04 13:56:41

标签: postgresql plpgsql

我在Windows 2012 R2上运行64位Postgres 10.3。每周我们都会在文本文件(44个单独的文件)中获取数据,并在PL / pgSQL函数中使用LOOP和COPY命令来导入数据。我解决了在解压缩数据时提供了错误密码的问题,因此源文件已创建但为空。导入功能似乎正在运行,但每次尝试时都会冻结在不同的文件中。

在尝试使用COPY之前,有没有办法(使用PL / pgSQL)检测磁盘上的文件是否为空?

1 个答案:

答案 0 :(得分:0)

您可以使用此功能。类似的东西:

CREATE OR REPLACE FUNCTION wwusp_filesize(file_path text)
RETURNS TEXT AS $BODY$
BEGIN
 DROP TABLE IF EXISTS tmp_file_size; 
 CREATE TEMPORARY TABLE tmp_file_size (size BIGINT);
 EXECUTE 'COPY tmp_file_size (size) FROM PROGRAM ''wc -c < ' || file_path || '''';
 RETURN (SELECT pg_size_pretty(size) FROM tmp_file_size);
END;
$BODY$ LANGUAGE plpgsql;

这适用于Linux服务器。如果您希望在Windows上也能使用它,只需将wc -c < file替换为相应的程序/语法。

# SELECT wwusp_filesize('/etc/postgresql/9.5/main/pg_hba.conf') AS filesize;
  filesize  
------------
 4641 bytes
(1 row)

使用空文件..

# SELECT wwusp_filesize('/etc/postgresql/9.5/main/empty_file') AS filesize;
 filesize 
----------
 0 bytes
(1 row)