ストアド・プロシージャとは、ご存知のとおりデータベース・カーネル上で実行される、何らかのロジックを含んだスキーマ・オブジェクトです。Oracle Databaseでは、PL/SQL(オラクルによるSQL拡張言語)、またはJavaを用いてストアド・プロシージャを実装することができます。
ストアド・プロシージャには、戻り値を持つものと持たないものがあります。戻り値を持つストアド・プロシージャを、特に「ストアド・ファンクション」と呼ぶこともあります。
ストアド・プロシージャは、パラメータをとる場合があります。パラメータには、入力パラメータである「INパラメータ」、出力パラメータである「OUTパラメータ」、両者を兼ねた「INOUTパラメータ」の3種類があります。
ここでは、SCOTTスキーマのPL/SQLストアド・プロシージャGIVE_RAISEを実行してみましょう。次のソース・コードを見れば分かるように、GIVE_RAISEプロシージャは、INパラメータとして部門番号(DEPTNO列)と昇給率(%)をとり、(EMP表のSAL列を更新して)その部門に所属する社員の給与を増加させるプロシージャです。
SQL> select line, text
from user_source where name='GIVE_RAISE';
|
ストアド・プロシージャは、あらかじめコンパイルされてデータベースに格納されており、パラメータを設定するだけで実行が可能です。この意味で、ストアド・プロシージャの実行は、プリペアド・ステートメントと非常に似た特徴を持っています。ストアド・プロシージャを実行するために利用するjava.sql.CallableStatementインターフェイスが、java.sql.PreparedStatement インターフェイスをextendsしているのも、このためです。
まず、次のサンプル・コードを見てみましょう。これは、部門番号(DEPTNO)が10である社員の給与を2倍に増額(+100%)した後、1/2に減額(?50%)するものです。
(※赤字部分はコメントです。コードの一部ではありませんのでご注意ください) // Javaデータアクセスの基礎 サンプル・コード(5) // JDBC APIをインポート
|
リスト JavaDataAccess05.java
|
このサンプル・コードの実行結果は、次のとおりです。
C:\JDBC>java JavaDataAccess05 |
では、順を追ってコードを見てみましょう。CallableStatementオブジェクトを作成するには、ConnectionオブジェクトのprepareCall()メソッドを利用します。プリペアド・ステートメントを作成するprepareStatement()メソッドと同様に、パラメータとしてSQL文を渡している点に注意しましょう。
prepareCall()メソッドに渡すSQL文では、エスケープ構文を使います。2つのパラメータをとる(戻り値を持たない)ストアド・プロシージャの構文は次のとおりです。
{call
my_procedure(?, ?)} |
(戻り値を持つ)ストアド・ファンクションであれば、次のような構文となります。
{? =
call my_procedure(?, ?)} |
“?”は、プリペアド・ステートメントの場合と同様に、(1から始まる)パラメータのプレース・ホルダを表します。
// CallableStatementを作成 |
次に、パラメータの設定を行います。INパラメータ、INOUTパラメータに対しては、プリペアド・ステートメントの場合と同様に、適切なsetXXX()メソッドを用いて、パラメータの値をセットします。
// INパラメータを設定 |
プロシージャ実行後に値を取り出す戻り値、OUTパラメータ、INOUTパラメータに対しては、registerOutParameter()メソッドで、対応するJDBCデータ型を指定する必要があります。仮に、GIVE_RAISEプロシージャが第3パラメータとして整数値のOUTパラメータを持っているとすれば、次のようにします。
// OUTパラメータを設定 |
すべてのプレース・ホルダの設定が完了したら、executeUpdate()メソッド(あるいはexecute()メソッド)を用いて、ストアド・プロシージャを実行します。
cstmt.executeUpdate(); |
戻り値、OUTパラメータ、INOUTパラメータに対しては、適切なgetXXX()メソッドを用いて、実行後に値を取り出す必要があります。仮に、GIVE_RAISEプロシージャが第3パラメータとして整数値のOUTパラメータを持っているとすれば、次のようにします。
int third_parameter
= cstmt.getInt(3); |
JDBC 1.2 APIに含まれる、JDBCの基本機能の紹介は、今回で終わりになります。次回からは、JDBC 2.0 APIの新機能を紹介していきます。
Copyright © ITmedia, Inc. All Rights Reserved.