多くのデータベースには、「ストアドプロシージャ」と呼ばれる一連のSQL手続きを表すことができるオブジェクトが用意されています。複雑なSQL命令をデータベースに発行するような場合には、アプリケーション側から動的に命令を送信するのではなく、このストアドプロシージャを利用することで、処理効率を向上させることができます。
すなわち、1つに、ストアドプロシージャを利用することで、アプリケーションサーバとデータベースサーバとがリモートの関係にある場合には、サーバ間を行き来するトラフィックを軽減することができます。そしてもう1つに、ストアドプロシージャはデータベース上であらかじめ解析・コンパイル処理された状態で格納(stored)されているので、実行に先立つ処理上のオーバヘッドを軽減することができます。
MySQLの現バージョン(4.0.x)ではストアドプロシージャは実装されていませんので(5.xでは実装予定)、ここではMicrosoft Accessの該当する機能――クエリを利用して、CallableStatementインターフェイスの例を示してみることにします。
<%@ page contentType="text/html; charset=Shift_JIS" import="java.sql.*" %> <table border="1"> <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection db=DriverManager.getConnection("jdbc:odbc:sample","",""); CallableStatement objSql=db.prepareCall("{call selectBooks (?)}"); objSql.setString(1,"@IT"); ResultSet rs=objSql.executeQuery(); ResultSetMetaData objMet=rs.getMetaData(); out.print("<tr>"); for(int i=1;i<=objMet.getColumnCount();i++){ out.print("<th>" + objMet.getColumnName(i) + "</th>"); } out.print("</tr>"); while(rs.next()){ out.print("<tr>"); for(int j=1;j<=objMet.getColumnCount();j++){ out.print("<td>" + rs.getString(j) + "</td>"); } out.write("</tr>"); } objSql.close(); db.close(); %> </table>
上記のコードの実行結果は以下になります。
CallableStatementインターフェイスによるデータベース発行もまた、ほとんど前述のStatement/PreparedStatementインターフェイスと変わるところはありません。ただ一点注意していただきたいのは、呼び出しの構文の個所です。
{call selectBooks (?)}
ストアドプロシージャ(クエリ)をコールする場合には、「{call ストアドプロシージャ名 (パラメータ,...)}」のように記述する必要があります。パラメータを表すプレイスホルダ(「?」)はストアドプロシージャ上で定義されたパラメータの数だけ、カンマ区切りで指定することができます。
ここでは、もう1つ注目すべき点として、ResultSetMetaDataインターフェイスを利用している点が挙げられます。ResultSetMetaDataはその名のとおり、結果セットの構成情報を管理するためのインターフェイスで、結果セットに含まれるフィールド数や、フィールド名、データ型、けた数などの情報を取得する手段を提供します。
Statementインターフェイスでの例のように、アプリケーションコード中にフィールド名をハードコーディングするのももちろん可能ですが、より汎用的なデータ表示のプログラムを作成したいといった場合、それでは用をなしません。
そこでResultSetMetaDataインターフェイスを介することで、現在の結果セットにおける列数やフィールド名を動的に取得しているわけです。列数さえ指定してしまえば、あとはforループによってフィールド名やフィールド値を取得することは可能です。
Resultset#getXxxxxメソッドでは、引数としてフィールド名だけではなく、列インデックスを指定できる点にも注目してください。
CallableStatementインターフェイスは、データベース上にあらかじめ用意されたストアドプロシージャを実行する場合に用います。ストアドプロシージャは複雑なSQL命令を効率よく実行する場合に有効です。
Copyright © ITmedia, Inc. All Rights Reserved.