我正尝试写一些SQL来根据information_schema中的内容从给定数据库中的所有PostgreSQL表复制数据。它应该会将数据文件输出到我的本地机器上,以便导入到另一台机器上。最终,我将对此进行调整,以便只转储表的选定部分(我转储的一些表有数百万条记录,我只需要一小部分数据用于测试)。
这是我目前掌握的情况
--Copy all tables...
DO
$$
DECLARE
formatstring text;
rec record;
BEGIN
RAISE NOTICE 'Copying tables...';
formatstring = 'COPY (select * from %I) to ''C:\Media\Code\%s.csv'';';
FOR rec IN
select table_name from information_schema.tables where table_schema = 'public' order by table_name
LOOP
RAISE NOTICE 'Table: %', rec.table_name;
RAISE NOTICE format(formatstring, rec.table_name, rec.table_name);
EXECUTE format(formatstring, rec.table_name, rec.table_name);
END LOOP;
END;
$$
LANGUAGE plpgsql;
但是,我得到了这个异常...
ERROR: unrecognized exception condition "format"
CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 12
********** Error **********
ERROR: unrecognized exception condition "format"
SQL state: 42704
Context: compilation of PL/pgSQL function "inline_code_block" near line 12
单引号的转义似乎没问题(已经检查过这个问题:Insert text with single quotes in PostgreSQL)。实际上,我可以做以下事情,它的工作,与文本被插入到格式:
select format('COPY (select * from %I) to ''C:\Media\Code\%s.csv'';', 'system_user', 'system_user');
有人能帮助解决这个问题吗?我可以很容易地编写一个脚本或代码,为我生成复制命令,但如果能在一个简单的SQL位中完成这一切,那就太好了。
1条答案
按热度按时间2ul0zpep1#
原因是第三个
RAISE
语句中的语法错误。有几种有效格式,但不能直接将 expression 提供给RAISE
。它必须是字符串文字-带有字符串插值选项。在做这件事的时候,简化一些其他的事情:
COPY
代替SELECT * FROM tbl
。format()
函数的格式说明符%1$I
和%1$s
,因此我们只需要提供一次表名。FOR
循环中使用标量变量而不是record
-我们只需要一列。