微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 具有动态文件名的COPY

我正在尝试编写一个函数来将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')

这非常容易受到sql注入的影响.为了防止它,我使用%L的format()来清理文件名.这也包括必要的封闭单引号.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐