【发布时间】:2015-04-13 05:32:44
【问题描述】:
我有一个sql函数:
CREATE OR REPLACE FUNCTION dump_func()
RETURNS void AS
$BODY$
DECLARE
r record;
loc varchar(100);
BEGIN
for r in (SELECT f.oid as oid, proname, pg_get_functiondef(f.oid) as src
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public') loop
loc = '/Users/raman/Desktop/functions/' || r.proname || '.sql';
raise notice '% - %', r.oid, loc;
raise notice 'func: %', r.src;
EXECUTE format('COPY (
SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = ''public'' and f.oid=%s
) TO ''%s'' ', r.oid, loc);
end loop;
end
$BODY$
LANGUAGE plpgsql;
使用 COPY 命令将 postgres 中的每个 db 函数导出到单独的文件中。除了在导出的 sql 文件中转义新行和制表符之外,一切正常,例如:
创建或替换函数 public.is_numeric(text)\n RETURNS boolean\n 语言 plpgsql\n IMMUTABLE\nAS $function$\nDECLARE x NUMERIC;\nBEGIN\n x = $1::NUMERIC;\n 返回 TRUE;\n例外 WHEN 其他 THEN\n RETURN FALSE;\nEND;\n$function$\n
你可以看到新的行和标签被转义了,如何解决这个问题?
【问题讨论】:
-
默认列分隔符不是 csv 格式的 os 选项卡,行分隔符总是换行...您可以指定其他分隔符,但您仍然无法摆脱 ASCII(10)
-
COPY是多行多列的,所以行和列之间必须有分隔符。这些分隔符可能总是与任意内容冲突。考虑在文件中使用客户端SELECT而不是服务器端COPY。 -
感谢 cmets,正如@Daniel 所说,使用客户端查询会更加灵活。我想一些 ant 脚本可能会解决这个问题。
标签: postgresql function