此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)
答案 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)。
除了上面描述的格式说明符之外,还有特殊的 序列%%可用于输出文字%字符。
强调我的