2011-06-06 4 views
6

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

Это то, что я изрубил:

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 ненадлежащим образом. Какие-нибудь советы?

+0

Можно ли добавить тег 'r' и решить его таким образом? –

+0

Я, конечно, подумал об этом ... но мне нужна была быстрая загрузка команды postgresql COPY ... У меня есть несколько десятков файлов ~ 500 МБ. –

+0

@dirk, если бы я должен катить строку запроса в R, я мог бы отправить ее в качестве запроса? Я думал, что могу только сделать это с помощью простого sql, а не plpgsql, поэтому я даже не пытался. –

ответ

6
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; 
+0

Спасибо Сет. Я был уверен, что это связано с тем, чтобы все разбиралось и возвращалось вместе в правильном порядке. Я бы, конечно, не расшифровал это без посторонней помощи. –

5

Не думаю, что я использовал бы 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 сервера прочитать разрешений на файл.

+1

, используя команду psql \ copy, я мог бы обернуть это на любом языке, на самом деле. Прекрасный подход. Благодаря! –

Смежные вопросы