2011-06-06 6 views
6

私はPostgreSQLを初めて使用し、一連のCSVファイルをループしてロードする機能を構築するのに苦労しています。 1つのファイルでCOPY作業をうまく動作させることができますが、FOR LOOP構文を正しく取得できません。plpgsql: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'; 

これがでエラーがスローされます。私は私のハエが/path/tmp.YEAR.out.csv

命名されているように、これは私がハッキングたものである年の数を代用しようとしています最初の||だから私は変数iの連結を不適切に管理していると思われる。任意のヒント?

+0

「r」タグを追加してそのように解決できますか? –

+0

私は確かにそれについて考えていましたが、postgresql COPYコマンドの高速ロードが必要でした...私は〜500MBのファイルを〜500MB持っています。 –

+0

@dirk、Rでクエリ文字列をロールするとクエリとして送信できますか?私はplpgsqlではなく、プレーンなSQLでしかできないと思っていたので、試してみませんでした。 –

答えて

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 

注:あなたも読んだことがあるためにpostgresのサーバのユーザを必要とCOPYでファイルを読み込むの問題を回避この方法ファイルに対するアクセス許可。

+1

psql \ copyコマンドを使用する実際にはどの言語でもそれをラップすることができます。気の利いたアプローチ。ありがとう! –