2017-12-02 20 views
0

私はテーブルにレコードを挿入するPostgres関数を書いています。入力にはいくつかの引数が必要です。CSVの引数のリストをPostgres関数に渡す方法

私は、関数の入力引数に一致する列を持つCSVを持っています。入力リストとしてCSVを入力して関数を呼び出すにはどうすればよいですか?

EDIT データベースはAWSのRDSインスタンスに存在します。だから私はsuperuserの一時テーブルにファイルをコピーする権限がありません。 file_fdwも、この拡張機能はAmazon RDSではサポートされていないため、オプションではありません。

答えて

0

COPY syntaxによれば、CSVファイルからデータをインポートするためのテーブルが必要です。例えば、ファイルからのデータをバッファリングするために一時テーブルを使用します。

do $$ 
begin 
    create temp table temp (
     name character varying, 
     email character varying, 
     level integer, 
     company_id integer, 
     comp_list integer[]); 
    copy temp from 'c:\data\test.csv' (format csv, header); 
    perform add_person(name, email, level, company_id, comp_list) 
    from temp; 
    drop table temp; 
end 
$$; 

また、あなたは拡張子file_fdw,例使用することができます。

create extension if not exists file_fdw; 

create server csv_server foreign data wrapper file_fdw; 

create foreign table csv_file (
    name character varying, 
    email character varying, 
    level integer, 
    company_id integer, 
    comp_list integer[] 
) server csv_server 
options (filename 'c:\data\test.csv', format 'csv', header 'on'); 

select add_person(name, email, level, company_id, comp_list) 
from csv_file; 
+0

を私は 'add_persons_from_csv' callled関数を作成するためにあなたの最初の方法を踏襲しました唯一の引数としてファイルのパスを指定します。そして、私は 'copy'コマンドで' $ 1 'を使用しました: '$ 1(format csv、header);をコピーします;' '$ 1'の前後に構文エラーがあります。私は何を間違えたのですか? – ddd

+0

このパラメータは 'COPY'で直接使用することはできません。このためには 'execute'([動的コマンド](https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN))を使用してください。 – klin

+0

私は元の関数 'name(name、email、level、company_id、comp_list)の値($ 1、$ 2、$ 3、$ 4、$ 5)に挿入します。そして、それは '実行'なしで正常に動作します – ddd

関連する問題