使用动态文件名复制 [英] COPY with dynamic file name
本文介绍了使用动态文件名复制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试编写一个将csv数据加载到表中的函数.我希望输入参数是文件的路径.
I am trying to write a function to load csv data into a table. I want the input argument to be the path to the file.
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
RETURNS void AS
$BODY$
BEGIN
COPY climatedata(
climatestationid,
date,
prcp,
prcpqflag,
prcpmflag,
prcpsflag,
tmax,
tmaxqflag,
tmaxmflag,
tmaxsflag,
tmin,
tminqflag,
tminmflag,
tminsflag)
FROM $1
WITH csv header;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.filltmaxa(character varying)
OWNER TO postgres;
当我尝试创建此功能时,我会得到
When I try to create this function I get
$ 1的语法错误
syntax error at $1
怎么了?
推荐答案
您需要动态SQL :
CREATE OR REPLACE FUNCTION loaddata(filepathname text)
RETURNS void AS
$func$
BEGIN
EXECUTE format ('
COPY climatedata(
climatestationid
, date
... -- more columns
, tminsflag)
FROM %L (FORMAT CSV, HEADER)' -- current syntax
-- WITH CSV HEADER' -- tolerated legacy syntax
, $1); -- pass function parameter filepathname to format()
END
$func$ LANGUAGE plpgsql;
format()
需要PostgreSQL 9.1+.
传递文件名时不使用额外的(转义)单引号集:
format()
requires PostgreSQL 9.1+.
Pass the file name without extra set of (escaped) single quotes:
SELECT loaddata('/absolute/path/to/my/file.csv')
format()
与%L
一起安全地转义文件名.没有它,很容易受到 SQL注入的影响.
format()
with %L
escapes the file name safely. Would be susceptible to SQL injection without it.
除了,您的函数名称不匹配:
Aside, you have a function name mismatch:
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
...
ALTER FUNCTION public.filltmaxa(character varying)
这篇关于使用动态文件名复制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文