将参数传递给Postgres中的存储函数

时间:2017-05-16 10:58:44

标签: postgresql stored-procedures plpgsql

此PostgreSQL COPY命令有效:

copy a from '/tmp/main.csv' WITH (FORMAT csv)

但我希望动态生成tablename和filepath。我怎么能这样做?

我通过调用select import_csv('/tmp/main.csv','a');

尝试了以下操作
CREATE OR REPLACE FUNCTION import_csv(
    csv_path text,
    target_table text)
  RETURNS void AS
$BODY$
begin
    set schema 'public';
    raise notice 'CSV PATH: %,TABLE NAME: %',csv_path,target_table;
    execute format('copy %I from %I WITH (FORMAT csv)',target_table, csv_path);
    return;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION import_csv(text, text)
  OWNER TO postgres;

我收到了错误:

  

注意:CSV路径:/tmp/main.csv,TABLE NAME:a

     

错误:语法错误在"" /tmp/main.csv"""

     

第1行:copy a from "/tmp/main.csv" WITH (FORMAT csv)

1 个答案:

答案 0 :(得分:2)

更改为:

execute format('copy %I from %L WITH (FORMAT csv)',target_table, csv_path);

%我引用了db对象,而path只是一个字符串

https://www.postgresql.org/docs/current/static/functions-string.html

  

用于生成格式说明符的格式转换类型   输出。支持以下类型:

     

将参数值格式化为简单字符串。空值是   被视为空字符串。

     

我将参数值视为SQL标识符,如果是,则重复引用它   必要。该值为null是错误的(相当于   quote_ident)。

     

L引用参数值作为SQL文字。空值是   显示为字符串NULL,不带引号(相当于   quote_nullable)。

     

除了上面描述的格式说明符之外,还有特殊的   序列%%可用于输出文字%字符。

强调我的