如何在 PostgreSQL 中使用 FOR 循环自动执行多个 CSV 导出?

How do I automate multiple CSV exports with FOR loop in PostgreSQL?

我正在尝试按符号导出一系列 csv 文件

CREATE OR REPLACE FUNCTION exportcrypto()
  RETURNS void AS
$func$
  declare
    irec record;
BEGIN
FOR irec IN
    SELECT DISTINCT symbol FROM daily
    LOOP
   EXECUTE 
   'COPY (SELECT o as open, h as high, l as low, c as close, v as volume, 0.0 as dividend, 1.0 as split FROM daily WHERE symbol =' || irec.symbol || ')
   TO "C:/Users/d/Documents/sdata/db_exports/crypto/' || irec.symbol || '.csv" WITH DELIMITER "," CSV HEADER;'
END LOOP;
END
$func$  
LANGUAGE plpgsql;

我遇到各种错误,例如 END LOOP 或 TO 处的语法错误,我尝试了复制字符串的变体。

将双引号替换为单引号并删除分号,除非 symbol 是数字(假定不是),否则也要在其周围添加引号:

EXECUTE 
'COPY (SELECT o as open, h as high, l as low, c as close, v as volume, 0.0 as dividend, 1.0 as split FROM daily WHERE symbol = ''' || irec.symbol || ''') TO ''C:/Users/d/Documents/sdata/db_exports/crypto/' || irec.symbol || '.csv'' WITH DELIMITER '','' CSV HEADER';

文字单引号 ' 被编码为双单引号 ''

也不要函数 returns 无效,将其定义为一个过程,LANGUAGE 也先行,所以整个事情应该是:

CREATE OR REPLACE PROCEDURE exportcrypto()
LANGUAGE plpgsql
AS $func$
  declare irec record;
BEGIN
FOR irec IN SELECT DISTINCT symbol FROM daily LOOP
    EXECUTE 
'COPY (SELECT o as open, h as high, l as low, c as close, v as volume, 0.0 as dividend, 1.0 as split FROM daily WHERE symbol = ''' || irec.symbol || ''') TO ''C:/Users/d/Documents/sdata/db_exports/crypto/' || irec.symbol || '.csv'' WITH DELIMITER '','' CSV HEADER';
END LOOP;
END
$func$