1

同様の質問がありますが、私の問題に対処していません。リモート データベースにストアド プロシージャを定義しています。その操作の一部として、SP はローカル ファイルから (ローカル マシンで実行されているアプリケーションを介して) 一括挿入する必要があります。手順は次のとおりです。

CREATE OR REPLACE FUNCTION upsert_realtime(path text, traveltime_table regclass)
  RETURNS void AS
$BODY$
BEGIN   
    EXECUTE format('COPY temp_table(link_id,start_time,end_time,travel_time,interval_time, travel_mode) FROM %L DELIMITER '';'' CSV', path);
    --...     
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION upsert_realtime(text, regclass)
  OWNER TO postgres;

SP に提供されるパスは、ローカル マシン上にあります。

select * from upsert_realtime('/home/.../travel_time.txt','realtime_travel_time');

したがって、次のエラーが発生します。

terminate called after throwing an instance of 'soci::postgresql_soci_error'
  what():  Cannot execute query. ERROR:  could not open file "/home/.../travel_time.txt" for reading: No such file or directory

私の頭に浮かぶ唯一のことは、どういうわけか自動的scpにファイルをpostgresqlサーバーに送信してからSPを実行することですが、これは最良のアイデアではありません。解決策を見つけるのを手伝ってもらえますか? どうもどうも

4

1 に答える 1

2

間違ったパスを使用しています。これはよくあるエラーの原因です。それはすべて「サーバーの観点から」です。

ファイル名を指定した COPY は、PostgreSQL サーバーにファイルから直接読み書きするように指示します。ファイルは PostgreSQL ユーザー (サーバーが実行されるユーザー ID) によってアクセス可能である必要があり、名前はサーバーの観点から指定する必要があります。PROGRAM が指定されている場合、サーバーは指定されたコマンドを実行し、プログラムの標準出力から読み取るか、プログラムの標準入力に書き込みます。このコマンドは、サーバーの観点から指定され、PostgreSQL ユーザーによって実行可能である必要があります。STDIN または STDOUT を指定すると、クライアントとサーバー間の接続を介してデータが送信されます。

使用可能なパスがない場合は、

  • ファイルをサーバーに移動し、正しいパスを使用します。
  • ローカル ファイルにアクセスできるサーバー上のプログラムを呼び出します。
  • psqlリモートサーバーに接続してローカルファイルを読み取るために使用します。
于 2015-01-28T04:04:40.050 に答える