2017-07-08 6 views
3

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が現在動作していますが(私は引き続き動作すると思われますが)、将来的に、特にこれが設計上の決定であったとしても、引き続きそうなるという保証はありません。

+0

最近の編集では、自分の質問に答えようとする試みが増えているようですが、答えとして投稿することを検討してください。 –

+0

私はこれを答えとして掲示することを検討しましたが、最終的に警告の背後にある理由は扱われていません。その理由は技術的なものです。 – HamburglarHelper

答えて

0

CallableStatementを使用して表関数の結果を取得しようとすると、最初の結果行のみが取得されます。

エラーは発生しませんが、結果は必要な結果にならない場合があります。したがって警告。

関連する問題