我在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';
该函数的功能和工作原理是从具有多个物种,方法的大表in this example tblA
中查询方法和物种,并将其与其位置数据一起检索。什么不起作用是COPY
声明。所以,我想添加的是一个语句,它在执行函数时将输出保存到.csv文件中。另外,是否可以根据例如添加动态filename.csv。 input_method和input_species?
DUMMY DATA
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函数中只有一个save-to语句
答案 0 :(得分:2)
使用PLPGSQL
代替SQL
快速入侵的示例。
警告:必须以超级用户身份创建。
将函数中的查询等替换为您需要的任何内容,并且可以向函数添加更多输入参数,以根据输入参数的不同创建查询或输出文件。
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'