0

PostgreSQL 9.0 を使用する Delphi 7 アプリケーションに取り組んでいます。データベースにいくつかの画像が保存されてOIDおり、アプリケーションはリモートで PostgreSQL に接続します。

私はこのクエリを使用しています:

"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.12 -p 5432 -d MyDB -U myDB_admin -c  "\lo_export 16848379 'C://leeImage.jpeg'"

フォームに画像を表示します。これは問題なく動作しますが、実行して画像を表示するのに約 1 秒ほどかかります。

そこで、クエリを次のようなストアド プロシージャに変換しようとしました。

CREATE OR REPLACE FUNCTION GET_FISHIMAGE(path TEXT ,Host TEXT,DatabaseName TEXT,userName TEXT,outputpath TEXT) RETURNS text AS $$
BEGIN
  //perform this..!!!
  //"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.12 -p 5432 -d myDB -U myDB_admin -c  "\lo_export 16848379 'C://leeImage.jpeg'"

END;
$$ LANGUAGE plpgsql;

インターネットで検索しましたが、変換が可能かどうかさえわかりません。上記のクエリをストアド プロシージャに変換する方法を誰か教えてもらえますか?

4

1 に答える 1

1

で記述されたサーバー関数から外部プログラムを起動するplpgsqlことはできません。また、それをサポートする言語 ( など) に切り替えてもplperlu、次の理由により問題は解決しません。

  • psql の起動と接続の確立のオーバーヘッドは同じであるため、クライアント マシンから実行する場合と同じくらいパフォーマンスが低下します。

  • この\lo_exportコマンドはデータベース サーバー上にファイルを作成しますが、クライアント マシン上ではファイルが必要です。それ以外の場合は、lo_export() SQL 関数を呼び出すことができpsql、画像を取得するためだけに起動する必要はありません。

この問題に対する単純で構造的にクリーンな解決策は、Delphi データベース ドライバがおそらく公開している BLOB API を使用して、サーバーからクライアントにバイナリ データを転送することです。

API にバイナリ データをフェッチするものがまったくないという万一の場合でも、バイナリ ラージ オブジェクトをエンコードするサーバー側関数をテキスト エンコードされたバージョンbase64または同様のものにクックし、それを client-側。これは、画像を取得する必要があるたびに psql を起動するよりもはるかに効率的です。

于 2012-05-18T17:32:42.863 に答える