Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用动态文件名复制_Sql_Postgresql_Plpgsql_Dynamic Sql_Postgresql Copy - Fatal编程技术网

Sql 使用动态文件名复制

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,

我正在尝试编写一个函数,将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;
当我尝试创建此函数时,我得到

$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)