sql – 具有动态文件名的COPY
发布时间:2021-02-24 22:46:07 所属栏目:MsSql教程 来源:网络整理
导读:我正在尝试编写一个函数来将csv数据加载到表中.我希望输入参数是文件的路径. CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar) RETURNS void AS$BODY$BEGINCOPY climatedata( climatestationid,date,prcp,prcpqflag,prcpmflag,prcpsflag,tm
我正在尝试编写一个函数来将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; 当我尝试创建此功能时,我得到了
它出什么问题了? 解决方法首先,您的函数名称不匹配: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;
SELECT loaddata('/absolute/path/to/my/file.csv') 这非常容易受到SQL注入的影响.为了防止它,我使用%L的format()来清理文件名.这也包括必要的封闭单引号. (编辑:上饶站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |