plpgsql: объединение переменной в предложение FROM - PullRequest
6 голосов
/ 07 июня 2011

Я новичок в Postgresql и изо всех сил пытаюсь создать функцию для циклической обработки серии CSV-файлов и их загрузки.Я могу заставить COPY нормально работать с одним файлом, но я не могу получить правильный синтаксис FOR LOOP.Я пытаюсь заменить номер года, так как мои мухи называются /path/tmp.YEAR.out.csv

Это то, что я взломал:

CREATE OR REPLACE FUNCTION test() RETURNS void as $$
BEGIN
  FOR i IN 1982..1983 LOOP
    COPY myTable 
    FROM '/path/tmp.' || i::VARCHAR || '.out.csv'
    delimiters ','
  END LOOP;
END;
$$ LANGUAGE 'plpgsql';

Это бросаетошибка при первом ||Поэтому я подозреваю, что управляю конкатом переменной i неправильно.Любые советы?

Ответы [ 2 ]

6 голосов
/ 07 июня 2011
CREATE OR REPLACE FUNCTION test() RETURNS void as $$
BEGIN
FOR i IN 1982..1983 LOOP
  EXECUTE 'COPY myTable FROM ''/path/tmp.' || i::text
                                           || '.out.csv'' DELIMITERS '',''; ';
END LOOP;
END;
$$ language plpgsql;
5 голосов
/ 07 июня 2011

Не думаю, что для этого использовал бы plpgsql. Сценарий оболочки может быть гораздо более полезным:

#!/bin/sh

DBHOST=mydbhost
DBNAME=mydbname

files=$1
target=$2

for file in ${files}; do
    psql -h ${DBHOST} ${DBNAME} -c "\copy ${target} FROM '${file}' delimiters ','"
done

пример использования:

csv2psql "$(ls *.out.csv)" someschema.tablename

Примечание. Таким образом, вы также обойдете проблему чтения файлов с помощью COPY, которая требует от пользователя сервера postgres разрешения на чтение для файла.

...