ここにはいくつかの問題があります。
SQLからC関数だけを呼び出すことはできません
まず、SQLから任意の関数を呼び出すだけでなく、PostgreSQLのC拡張APIとマクロを使用する必要があります。例として、ソース内のSQL呼び出し可能関数の既存の実装を確認してください。
通常、コアコードを変更する必要はありません。多くの場合、拡張機能で十分です
。
次に、コアPostgreSQLに関数を追加する場合は、それらをsrc/include/catalog/pg_proc.h
に追加する必要があります。 したがって、それらはinitdb
の間に定義されます 。
ただし、適切な拡張ロード機能を使用することをお勧めします。
- http://www.postgresql.org/docs/ current / static / xfunc-c.html
- http://www.postgresql.org/docs/ current / static / extend-pgxs.html
このようにして、LOAD
できます 拡張モジュール、CREATE FUNCTION
Cはドキュメントに従って機能し、SQLから呼び出します。
あなたの特定のケースでは、あなたがしているように見えます コアコードベースを変更する必要がありますが、これは非常に珍しいので、他の人のためにこのアドバイスを保持しています。
PostgreSQLバックエンドのC関数をGUIから「直接」呼び出すことはできません
あなたはJavaSwingGUIを持っていて、C関数を別のプロセスで、場合によっては別のホストで、それから何らかの形で呼び出すことを想定しています。
これは、次のようなさまざまな理由で機能しません。
- Javaは、
JNI
のようなグルーコードなしでC関数を直接呼び出すことはできません。 またはJNA
。 - 別のプロセスでC関数を直接呼び出すことはできません。代わりに、プロセス間通信(共有メモリ、パイプ、ソケット、共有ファイルなど)を使用して情報を交換する必要があります
- JavaインタープリターをPgバックエンドに埋め込んで、JNIを介してC関数を直接呼び出すことはできますが、本当に Pgバックエンド内から直接SwingGUIを表示しようとしないでください。
必要なのは多段階のプロセスです:
-
PostgreSQLバックエンドでキャプチャするデータを収集します。作成されたのと同じ接続からアクセスする場合は、通常の
palloc
を使用できます。 'dバッファ。それ以外の場合は、共有メモリからバッファを割り当てるか、ファイルシステムを使用してデータを交換する必要があります。 -
PostgreSQLのC拡張関数のドキュメント(上記)に従って、SQL呼び出し可能なインターフェイスで作成されたC関数からそのデータにアクセスします
-
PostgreSQL接続を使用して、SQL呼び出し可能インターフェース関数からJavaアプリケーションにデータを転送します。アプリケーションでデコードし、必要に応じて表示します。
または:
-
JavaプログラムまたはそのエージェントがPostgreSQLサーバーと同じシステムで実行され、エージェントがPgに書き込み可能で、プログラムが読み取り可能な場所にファイルを書き込むようにする必要があります。
-
プログラムまたはそのエージェントを使用してファイルを読み取り、表示用に処理します
プログラムがリッスンしているソケットにPgを書き込むこともできますが、プログラムのストールがPostgreSQLのパフォーマンスの問題を引き起こすため、これはお勧めしません。