Я пытаюсь экспортировать серию 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';
Буквальная одинарная кавычка '
кодируется как двойная одинарная кавычка ''
.
Кроме того, вместо функции, которая возвращает void, определите ее как процедуру, и 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$
@Bohemain Возможно, вы захотите упомянуть, что процедуры действительны только в Postgres v11 или выше. Спецификация языка может идти либо до, либо после. В основном это предпочтение