JDBC CallableStatement
を使用して、SETOF
(特にREFCURSOR
)を返すPostgreSQLストアド関数を実行するべきではない技術的な理由はありますか? PostgreSQL JDBC documentation当たりSETOFを返すPostgres関数をJDBC CallableStatementから呼び出せないのはなぜですか?
:セットとしてデータを返す
機能
CallableStatement
インターフェースを介して呼び出されるべきではなく、その代わりに通常 書又はPreparedStatement
インターフェイスを使用する必要があります。
それ以外では、理由、パフォーマンス、バグに関連する、またはそれ以外の理由は見当たりませんでした。特定の関数(特に複数の結果セットを返す関数)でできることを本質的に制限しているようで、別のデータベースからPostgreSQLにプロシージャを移植する際の面倒さが少しあります。
私は、このソフトウェアをリリースしている組織からの警告を無視していますが、もっと詳しく知りたいのは興味があります。私は、一回のショットでサーバーからクライアントに送信されるデータの量に関して、カーソルと結果セットが異なって扱われることを認識していますが、これは既に欠点として文書化されています。
UPDATE PostgreSQLで実装されたCallableStatement
関数は、呼び出し文字列の形式をselect文に変換します。したがって、SETOF
を返す関数(およびすべての関数)のJDBC実行は、PreparedStatement
と同じ方法で処理されます。
JDBC CallableStatement
は、出力パラメータを処理できるPreparedStatement
です。 SETOF
を返すPostgreSQL関数は出力パラメータを含めることができないため、CallableStatement
はそのような関数のための追加機能を提供しません。 PostgreSQLのドキュメントでは、出力パラメータを含まない関数に対してはCallableStatement
を使用することを妨げず、現時点ではCallableStatement
を使用しない理由について技術的な理由はないようです。
私の同僚は、この警告は長い間存在していたと指摘しています。そのため、バグではなく設計上の決定と思われます。 CallableStatement
が現在動作していますが(私は引き続き動作すると思われますが)、将来的に、特にこれが設計上の決定であったとしても、引き続きそうなるという保証はありません。
最近の編集では、自分の質問に答えようとする試みが増えているようですが、答えとして投稿することを検討してください。 –
私はこれを答えとして掲示することを検討しましたが、最終的に警告の背後にある理由は扱われていません。その理由は技術的なものです。 – HamburglarHelper