我正在尝试编写一个函数来将csv数据加载到表中.我希望输入参数是文件的路径.
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;
当我尝试创建此功能时,我得到了
Syntax error at $1
它出什么问题了?
解决方法
首先,您的函数名称不匹配:
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar) ... ALTER FUNCTION public.filltmaxa(character varying)
但这是一个额外的问题.
回答
你需要动态sql:
CREATE OR REPLACE FUNCTION loaddata(filepathname text) RETURNS void AS $func$ BEGIN EXECUTE format (' COPY climatedata( climatestationid,tminsflag) FROM %L (FORMAT CSV,HEADER)',$1); -- current Syntax --- WITH CSV HEADER',$1); -- tolerated legacy Syntax END $func$LANGUAGE plpgsql;
format()
需要Postgresql 9.1.
这样,我们可以提供文件名而无需额外的一组(转义)单引号.呼叫:
SELECT loaddata('/absolute/path/to/my/file.csv')