sql - 使用动态文件名将 sql 函数的输出保存到 csv 文件(COPY)

标签 sql postgresql export-to-csv sql-function

我在 MacOSX 上运行 Postgres 9.3。我正在尝试在函数内添加 COPY 语句以实现自动保存到文件的过程。

我对任何类型的 sql 编码都是新手,所以这是我目前所掌握的;

CREATE FUNCTION retrieve_info(input_method TEXT, input_species TEXT) RETURNS SETOF   
retrieve_info_tbl AS $$
   SELECT tblA.id, tblA.method, tblA.species, tblA.location
   FROM tblA
   WHERE method=input_method AND species=input_species
   GROUP BY id, method, species
   ORDER BY location
   COPY (SELECT * FROM retrieve_info_tbl) TO 'myfilepath/filename.csv' WITH CSV;
$$ LANGUAGE 'sql';

该函数的作用和工作原理是从一个更大的表在此示例中的 tblA 中查询一个方法和一个物种,其中包含多个物种、方法,并将其连同其位置数据一起检索。 COPY 语句不起作用。所以,我想添加的是一条在执行函数时将输出保存到 .csv 文件的语句。此外,是否可以根据例如添加动态 filename.csv input_method 和 input_species?

虚拟数据

tblA(填充)

create table tblA (id varchar(5) PRIMARY KEY, method text, species varchar(10), location    
text);
insert into tblA values ('1a', 'mtd1', 'sp1', 'locA'),('1b', 'mtd1', 'sp2', 'locC'),('1c',  
'mtd2', 'sp3', 'locB'),('1d', 'mtd1', 'sp1', 'locB'),('1e', 'mtd2', 'sp5', 'locA');

retrieve_info_tbl(空)

create table retrieve_info_tbl (id varchar(5) PRIMARY KEY, method text, ind varchar(10),  
location text);

输出 (当函数中没有加入COPY语句时)

retrieve_info(mtd1, sp3)

id | method | ind | location
----------------------------
1a | mtd1   | sp3 | locA
1d | mtd1   | sp3 | locB

...并希望将其保存到“/myfilepath/mtd1_sp3.csv(动态文件名)”

非常感谢,

更新:我很乐意在 sql 函数中添加一个保存语句

最佳答案

一个使用 PLPGSQL 而不是 SQL 的快速组合示例。

警告:必须以 super 用户身份创建。

将函数中的查询等替换为您需要的任何内容,您可以向函数添加更多输入参数,以根据这些输入参数的不同创建不同的查询或输出文件。

CREATE OR REPLACE FUNCTION copy_out_example ( p_path TEXT, p_filename_prefix TEXT, OUT file_and_path TEXT )
RETURNS TEXT AS
$func$
DECLARE
    qry TEXT;
BEGIN
    file_and_path := RTRIM(p_path,'/') || '/' || p_filename_prefix || '_' || ceil(random() * 1000000)::TEXT || '.csv';

    qry := FORMAT('COPY (select * from pg_catalog.pg_class) TO %L CSV HEADER',file_and_path);
    EXECUTE qry;
END;
$func$ LANGUAGE plpgsql STRICT SECURITY DEFINER;

SELECT copy_out_example('/path/to/the/file','some_test_file');

生成类似 '/path/to/the/file/some_test_file_994216.csv' 的文件

关于sql - 使用动态文件名将 sql 函数的输出保存到 csv 文件(COPY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19898708/

相关文章:

sql - 在 laravel [实现过滤器] 中通过 Eloquent 和急切的加载将多个表连接在一起

sql - 如何在存储过程中检查两个 SELECT 语句的输出是否等于、大于或小于?

java - UUID 不适用于 JOOQ 和 PostgreSQL

php - CSV 根据内容调整列大小

sql - 按小时分组,汇总平均值

python - 一种将非常大的 csv 数据写入 SQL 数据库的方法

postgresql - 使用 pg_notify 触发器中的行数据作为 channel 名称?

sql - 仅当 SQL 中存在行时返回值

python - pandas DataFrame to_csv (python) 中的 CSV 方言

shell - 格式化 Neo4J-Shell 密码查询结果?