14

PostgreSQL のドキュメントCallableStatementでは、 を使用してストアド プロシージャを呼び出すことを推奨しています。

行セットを返すストアド プロシージャの場合、使用の違いは何ですかCallableStatement

String callString = "{ call rankFoos(?, ?) }";
CallableStatement callableStatement = con.prepareCall(callString);
callableStatement.setString(1, fooCategory);
callableStatement.setInt(2, minimumRank);
ResultSet results = statement.executeQuery();

そして通常の使用PreparedStatement

String queryString = "SELECT FooUID, Rank FROM rankFoos(?, ?);";
PreparedStatement preparedStatement = connection.prepareStatement(queryString);
preparedStatement.setString(1, fooCategory);
preparedStatement.setInt(2, minimumRank);
ResultSet results = statement.executeQuery();

私が理解CallableStatementしているように、言語に依存しない方法でストアド プロシージャを呼び出すことができます。私は PostgreSQL を使用していることを知っているので、これは私にとっては問題ではありません。私が見る限り、を使用する明らかな利点は、ストアド プロシージャをテーブルとして扱い、その上で、、 などPreparedStatementを使用できる、より用途の広いクエリです。WHEREJOINORDER BY

私が見逃している方法の間に側面や違いはありますか? ストアド プロシージャをクエリとして使用する場合、どれが推奨されますか?

4

2 に答える 2

14

2 番目のアプローチが一部の RDBMS ではまったく機能しないことは確かですが、PostgreSQL のみを使用するため、あまり問題にはなりません。あなたの単純なケースでは、マイナス面はあまりありません。ポップアップ表示される問題が 2 つあります。

  1. ストアド プロシージャの記述方法によっては、プロシージャを実行するためにパラメータを登録する必要がある場合があります。準備されたステートメントでは、それはまったく不可能です。ストアド プロシージャの作成と呼び出しコードの両方を制御する場合は、おそらくこれについて心配する必要はありません。

  2. そもそも、ストアド プロシージャを呼び出す効果が制限されます。ストアド プロシージャの主な利点の 1 つは、クエリ ロジックをデータベース レベルでカプセル化できることです。これにより、コードを変更することなく、クエリを調整したり、場合によっては機能を追加したりできます。ストアド プロシージャ呼び出しの結果に where 句の結合を追加することを計画している場合は、元のクエリを Java レイヤーに入れてみませんか?

于 2011-09-17T21:41:47.943 に答える
7

主な違いは、独立性とカプセル化されたプログラミング方法です。

あなたが Java プログラマーで、データベースの使い方を知らないとします。このようにすると、2 番目の方法を使用できず、2 番目の方法で問題が発生します。

最初の方法では、Java コードを実行し、ストアド プロシージャとして quire を作成するよう誰かに依頼して、簡単に使用できるようにします。

私は@dlawrenceに同意します

于 2012-10-20T07:11:10.060 に答える