13

PostgreSQL documentationは、CallableStatementを使用してストアドプロシージャを呼び出すことを推奨しています。クエリとしてのストアドプロシージャ:CallableStatementとPreparedStatement

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オファーを行セットを返すストアドプロシージャの場合は

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

がある態様または違いです私が紛失している方法の間に?クエリとして使用されるストアドプロシージャの場合は推奨されますか?

答えて

12

2番目のアプローチはRDBMSではうまくいきませんが、PostgreSQLを使うつもりなので、あまり関係はありません。あなたの単純なケースでは、本当に欠点はあまりありません。

  1. をストアドプロシージャが書かれている、彼らは手順を実行するためのパラメータを登録する必要があり方法に応じて:私はポップアップ見ることができる2つの問題があります。それは準備された声明では全く可能ではありません。ストアドプロシージャの作成と呼び出しコードの両方を制御する場合は、おそらくこれについて心配する必要はありません。

  2. 最初にストアドプロシージャを呼び出す効率が制限されます。ストアドプロシージャの主な利点の1つは、クエリロジックをデータベースレベルでカプセル化することです。これにより、クエリをチューニングしたり、場合によってはコードを変更することなく機能を追加することができます。ストアドプロシージャコールの結果にwhere句を追加することを計画している場合、元のクエリをJavaレイヤに配置するだけではどうですか?

7

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

あなたがJavaプログラマであり、データベースの使い方がわからないと想像してください。この方法では2番目の方法を使用できません.2番目の方法で問題が発生します。

最初の方法では、あなたのJavaコードを実行し、誰かにあなたのためにquoredをStored-Procedureとして書いてもらうことができます。

私は@dlawrenceに同意します

+0

良い洞察力。ありがとう! –

関連する問題