Sql 使用动态文件名复制
我正在尝试编写一个函数,将csv数据加载到表中。我希望输入参数是文件的路径Sql 使用动态文件名复制,sql,postgresql,plpgsql,dynamic-sql,postgresql-copy,Sql,Postgresql,Plpgsql,Dynamic Sql,Postgresql Copy,我正在尝试编写一个函数,将csv数据加载到表中。我希望输入参数是文件的路径 CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar) RETURNS void AS $BODY$ BEGIN COPY climatedata( climatestationid, date, prcp, prcpqflag, prcpmflag, prcpsflag, tmax,
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;
当我尝试创建此函数时,我得到
$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;
需要PostgreSQL 9.1+。传递文件名,不带额外的(转义)单引号集:
SELECT loaddata('/absolute/path/to/my/file.csv')
format()
with%L
安全地转义文件名。如果没有它,将容易受到SQL注入的影响
另外,函数名不匹配:
创建或替换函数public.loaddata(filepathname varchar)
...
ALTER FUNCTION public.filltmaxa(字符变化)
什么版本的Postgres?您知道postgresql的copy命令内置了CSV解析,对吧?这非常有效!我正在运行PostgreSQL 9.2,因此format()函数可用。我相信你可以告诉我,我对博士后很陌生,在学习的过程中我学到了很多东西。我非常感谢你花时间回答这个问题。谢谢
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
...
ALTER FUNCTION public.filltmaxa(character varying)