ストアド・プロシージャを利用する
ストアド・プロシージャとは、ご存知のとおりデータベース・カーネル上で実行される、何らかのロジックを含んだスキーマ・オブジェクトです。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.