検索
連載

ステートメントの高速化Javaデータアクセスの基礎(4)(2/2 ページ)

PC用表示
Share
Tweet
LINE
Hatena
前のページへ |       

ストアド・プロシージャを利用する

 ストアド・プロシージャとは、ご存知のとおりデータベース・カーネル上で実行される、何らかのロジックを含んだスキーマ・オブジェクトです。Oracle Databaseでは、PL/SQL(オラクルによるSQL拡張言語)、またはJavaを用いてストアド・プロシージャを実装することができます。

 ストアド・プロシージャには、戻り値を持つものと持たないものがあります。戻り値を持つストアド・プロシージャを、特に「ストアド・ファンクション」と呼ぶこともあります。

 ストアド・プロシージャは、パラメータをとる場合があります。パラメータには、入力パラメータである「INパラメータ」、出力パラメータである「OUTパラメータ」、両者を兼ねた「INOUTパラメータ」の3種類があります。

ストアド・プロシージャの実行

 ここでは、SCOTTスキーマのPL/SQLストアド・プロシージャGIVE_RAISEを実行してみましょう。次のソース・コードを見れば分かるように、GIVE_RAISEプロシージャは、INパラメータとして部門番号(DEPTNO列)と昇給率(%)をとり、(EMP表のSAL列を更新して)その部門に所属する社員の給与を増加させるプロシージャです。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ストアド・プロシージャは、あらかじめコンパイルされてデータベースに格納されており、パラメータを設定するだけで実行が可能です。この意味で、ストアド・プロシージャの実行は、プリペアド・ステートメントと非常に似た特徴を持っています。ストアド・プロシージャを実行するために利用するjava.sql.CallableStatementインターフェイスが、java.sql.PreparedStatement インターフェイスをextendsしているのも、このためです。

ステートメントとストアド・プロシージャの両方を実行してみる

 まず、次のサンプル・コードを見てみましょう。これは、部門番号(DEPTNO)が10である社員の給与を2倍に増額(+100%)した後、1/2に減額(?50%)するものです。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

実行結果

 このサンプル・コードの実行結果は、次のとおりです。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 では、順を追ってコードを見てみましょう。CallableStatementオブジェクトを作成するには、ConnectionオブジェクトのprepareCall()メソッドを利用します。プリペアド・ステートメントを作成するprepareStatement()メソッドと同様に、パラメータとしてSQL文を渡している点に注意しましょう。

 prepareCall()メソッドに渡すSQL文では、エスケープ構文を使います。2つのパラメータをとる(戻り値を持たない)ストアド・プロシージャの構文は次のとおりです。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 (戻り値を持つ)ストアド・ファンクションであれば、次のような構文となります。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 “?”は、プリペアド・ステートメントの場合と同様に、(1から始まる)パラメータのプレース・ホルダを表します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 次に、パラメータの設定を行います。INパラメータ、INOUTパラメータに対しては、プリペアド・ステートメントの場合と同様に、適切なsetXXX()メソッドを用いて、パラメータの値をセットします。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 プロシージャ実行後に値を取り出す戻り値、OUTパラメータ、INOUTパラメータに対しては、registerOutParameter()メソッドで、対応するJDBCデータ型を指定する必要があります。仮に、GIVE_RAISEプロシージャが第3パラメータとして整数値のOUTパラメータを持っているとすれば、次のようにします。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 すべてのプレース・ホルダの設定が完了したら、executeUpdate()メソッド(あるいはexecute()メソッド)を用いて、ストアド・プロシージャを実行します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 戻り値、OUTパラメータ、INOUTパラメータに対しては、適切なgetXXX()メソッドを用いて、実行後に値を取り出す必要があります。仮に、GIVE_RAISEプロシージャが第3パラメータとして整数値のOUTパラメータを持っているとすれば、次のようにします。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 JDBC 1.2 APIに含まれる、JDBCの基本機能の紹介は、今回で終わりになります。次回からは、JDBC 2.0 APIの新機能を紹介していきます。

Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る