ストアド プロシージャで大きなデータを読み取るサンプル
この Microsoft SQL Server JDBC Driver サンプル アプリケーションは、ストアド プロシージャから大きな OUT パラメーターを取得する方法を示しています。
このサンプルのコード ファイルは executeStoredProcedure.java という名前で、次の場所にあります。
<インストール ディレクトリ>\sqljdbc_<バージョン>\<言語>\help\samples\adaptive
必要条件
このサンプル アプリケーションを実行するには、SQL Server 2005 AdventureWorks サンプル データベースが必要です。また、クラスパスの設定で sqljdbc.jar ファイルまたは sqljdbc4.jar ファイルを追加する必要があります。クラスパスに sqljdbc.jar または sqljdbc4.jar のエントリがない場合、サンプル アプリケーションで "Class not found" という一般的な例外がスローされます。クラスパスの設定方法の詳細については、「JDBC ドライバーの使用」を参照してください。
メモ : |
---|
Microsoft SQL Server JDBC Driver Version 2.0 には、sqljdbc.jar と sqljdbc4.jar という 2 つのクラス ライブラリ ファイルが用意されており、必要な Java ランタイム環境 (JRE) 設定によって自由に使い分けることができます。選択する JAR ファイルの詳細については、「JDBC ドライバーのシステム要件」を参照してください。 |
SQL Server 2005 AdventureWorks サンプル データベースでは、次のストアド プロシージャも作成する必要があります。
CREATE PROCEDURE GetLargeDataValue
(@Document_ID int,
@Document_ID_out int OUTPUT,
@Document_Title varchar(50) OUTPUT,
@Document_Summary nvarchar(max) OUTPUT)
AS
BEGIN
SELECT @Document_ID_out = DocumentID,
@Document_Title = Title,
@Document_Summary = DocumentSummary
FROM Production.Document
WHERE DocumentID = @Document_ID
END
例
次の例のサンプル コードでは、SQL Server 2005 AdventureWorks データベースへの接続を行います。次に、サンプル データを作成し、パラメーター化されたクエリを使用して Production.Document テーブルを更新します。さらに、SQLServerStatement クラスの getResponseBuffering メソッドを使用してアダプティブ バッファリング モードを取得し、GetLargeDataValue ストアド プロシージャを実行します。JDBC Driver Version 2.0 リリース以降では、responseBuffering 接続プロパティが既定で "adaptive" に設定されていることに注意してください。
最後に、OUT パラメーターで返されたデータを表示します。また、ストリームに対して mark
メソッドと reset
メソッドを使用して、データの任意の部分を再度読み取る方法も示しています。
import java.sql.*;
import java.io.*;
import com.microsoft.sqlserver.jdbc.SQLServerCallableStatement;
public class executeStoredProcedure {
public static void main(String[] args) {
// Create a variable for the connection string.
String connectionUrl =
"jdbc:sqlserver://localhost:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;";
// Declare the JDBC objects.
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
// Establish the connection.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(connectionUrl);
// Create test data as an example.
StringBuffer buffer = new StringBuffer(4000);
for (int i = 0; i < 4000; i++)
buffer.append( (char) ('A'));
PreparedStatement pstmt = con.prepareStatement(
"UPDATE Production.Document " +
"SET DocumentSummary = ? WHERE (DocumentID = 1)");
pstmt.setString(1, buffer.toString());
pstmt.executeUpdate();
pstmt.close();
// Query test data by using a stored procedure.
CallableStatement cstmt =
con.prepareCall("{call dbo.GetLargeDataValue(?, ?, ?, ?)}");
cstmt.setInt(1, 1);
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.registerOutParameter(3, java.sql.Types.CHAR);
cstmt.registerOutParameter(4, java.sql.Types.LONGVARCHAR);
// Display the response buffering mode.
SQLServerCallableStatement SQLcstmt = (SQLServerCallableStatement) cstmt;
System.out.println("Response buffering mode is: " +
SQLcstmt.getResponseBuffering());
SQLcstmt.execute();
System.out.println("DocumentID: " + cstmt.getInt(2));
System.out.println("Document_Title: " + cstmt.getString(3));
Reader reader = SQLcstmt.getCharacterStream(4);
// If your application needs to re-read any portion of the value,
// it must call the mark method on the InputStream or Reader to
// start buffering data that is to be re-read after a subsequent
// call to the reset method.
reader.mark(4000);
// Read the first half of data.
char output1[] = new char[2000];
reader.read(output1);
String stringOutput1 = new String(output1);
// Reset the stream.
reader.reset();
// Read all the data.
char output2[] = new char[4000];
reader.read(output2);
String stringOutput2 = new String(output2);
// Close the stream.
reader.close();
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
finally {
if (rs != null) try { rs.close(); } catch(Exception e) {}
if (stmt != null) try { stmt.close(); } catch(Exception e) {}
if (con != null) try { con.close(); } catch(Exception e) {}
}
}
}