JDBCTMガイド:入門7-Callable Sttement


7-Callable Stotementの概要は、「JDBCTM Database Access from JavaTM:A Tutorial and Annotated Reference」という本から抜粋されたものです。JavaSoftは今この本を準備しています。この本は教程であり、JDBCの重要な参考マニュアルでもあります。Javaシリーズの構成部分として1997年春にAddison-Wesleyから出版されます。7.1概説CallableStatitオブジェクトは全てのDBMSに対して標準的な形で保存プロセスを呼び出す方法を提供している。保存中はデータベースに保存されています。格納されたプロセスに対する呼び出しは、Callable Statimentオブジェクトに含まれる内容である。このような呼び出しは一種のトランスコード文法で書かれています。一つの形式には結果パラメータがあり、もう一つの形式には結果パラメータがありません。結果パラメータは出力(OUT)パラメータであり、格納されているプロセスの戻り値です。両方の形式は可変数の入力(INパラメータ)、出力(OUTパラメータ)または入出力(INOUTパラメータ)のパラメータを持つことができます。疑問符はパラメータのプレースホルダとして使用されます。JDBCで保存済みプロセスを呼び出すシンタックスは以下の通りです。四角い括弧はその中の内容がオプションであることを表しています。括弧自体は文法の構成部分ではありません。プロセス名をコールします。結果パラメータを返す過程のシンタックスは「?=」です。プロセス名をコールします。パラメータを持たない格納プロセスのシンタックスは類似しています。「callプロセス名」は、通常、Callable Statementオブジェクトを作成する人は、使用されているDBMSが格納プロセスをサポートしていることを知っていなければなりません。これらのプロセスは何かを知っています。しかし、もし検査が必要なら、多くのDatabaseMetaData方法はこのような情報を提供することができます。例えば、DBMSが格納プロセスの呼び出しをサポートすると、supports StredProcesdures方法はtrueに戻り、get Procesdues方法は格納されたプロセスについての説明に戻る。CallableStatimentは、一般的なSQL文を処理するためのSttementを継承し、PreparedSttementの方法(INパラメータを処理するためのもの)も継承しています。OUTパラメータまたはINOUTパラメータの出力部:OUTパラメータを登録するJDBCタイプ(一般的なSQLタイプ)、これらのパラメータから結果を検索する方法はすべて、OUTパラメータまたはINOUTパラメータの出力部を処理するために使用されます。7.1.1 Callables Stationオブジェクトを作成するCallable StatimentオブジェクトはConnection方法prepare Callで作成された。次の例は、保存済みプロセスgetTestDataに対して呼び出しを含むCallable Statimentの例を作成する。このプロセスには2つの変数がありますが、結果パラメータは含まれていません。そのうちプレースホルダはIN、OUTまたはINOUTのパラメータであり、格納されているプロセスget TestDataに依存します。7.1.2 INとOUTパラメータがINパラメータをCallable Statimentオブジェクトに送るのはsetXXX方法によって行われます。この方法はPreparedSttementから継承される。着信パラメータのタイプは、使用されるsetXXX方法(例えば、setFloatでfloat値などに入る)を決定する。セーブ中にOUTパラメータに戻ると、Callable Statimentオブジェクトを実行する前に、OUTパラメータ毎のJDBCタイプを登録しなければなりません。JDBCタイプを登録するには、register OutParameter方法で行います。ステートメントが実行されたら、Callable StatitementのgetXXXメソッドはパラメータ値を返します。正確なgetXXXメソッドは、各パラメータに登録されたJDBCタイプに対応するJavaタイプ(JDBCタイプからJavaタイプへの標準マッピングは8.6.1節の表を参照)です。つまり、register OutParameterはJDBCタイプを使用していますが、getXXXはそれをJavaタイプに変換します。例として、下記のコードはOUTパラメータを登録して、cstmtで呼び出された格納プロセスを実行し、OUTパラメータで返された値を検索します。方法getByteは最初のOUTパラメータからJavaバイトを取り出し、get BigDecimalは第二のOUTパラメータからBigDecimalオブジェクトを取り出します。(小数点以下、後段3桁):Callable Statement cstmt=con.prepcall(「{call getTestData])」);cstmt.register OutParameeter(1、java.sql.Types.TININT)cstmt.register OutParameeter(2、java.sql.Types.DECIMAL、3)cstmt.executeQuery()byte x=cstmt.getBytte(1);java.math.Big Decimal n=cstmt.get Big Decimal(2,3)Callable StotementはResultSetとは違って、増分でOUT値を検索する特殊な仕組みを提供していません。7.1.3 INOUTパラメータは、入力と出力の両方をサポートするパラメータ(INOUTパラメータ)は、Register OutParameterメソッドを呼び出す以外に、適切なsetXXXメソッドを呼び出す必要があります。setXXXメソッドはパラメータ値を入力パラメータに設定し、Register OutParameter方法はそのJDBCタイプを出力パラメータに登録します。setXXX方法はJava値を提供します。ドライバはまずこの値をJDBC値に変換して、それをデータベースに送ります。このIN値のJDBCタイプとregister OutParameter方法に提供するJDBCタイプは同じであるべきです。そして、出力値を検索するには、対応するgetXXX方法が必要です。例えば、Javaタイプがbyteであるパラメータは、方法setBytteを用いて入力値を付与するべきである。register OutParameeterには、TINYINTのJDBCタイプを提供するとともに、getBytteを用いて出力値を検索する必要がある(第8節「JDBCとJavaタイプのマッピング」は詳細情報とタイプマップ表を提供する)。次の例では、保存済みプロセスrevisetotalがあると仮定し、その唯一のパラメータはINOUTパラメータである。メソッドsetByteはこのパラメータを25に設定し、ドライバはそれをJDBC TINYINTタイプとしてデータベースに送ります。次に、register OutParameeterは、このパラメータをJDBC TINYINTとして登録する。これを実行したら、新しいJDBC TINYINT値を返します。方法getByteはこの新しい値をJava byteタイプとして検索します。Callable Stotement cstmt=con.prepareCall(「{call revisetotal]」);cstmt.setByte(1,25)cstmt.register OutParameeter(1、java.sql.Types.TININT)cstmt.executeUpdate()byte x=cstmt.getBytte(1);7.1.4まず結果を検索して、OUTパラメータをいくつかのDBMSの制限のため、最大の移植可能性を実現するためには、まずCallable Startementオブジェクトを実行することによって発生した結果を検索して、Callable Statement.getXXX方法でOUTパラメータを検索することを提案します。もしCallable Steementオブジェクトが複数のResultSetオブジェクトに戻ったら(executeメソッドを呼び出して)、OUTパラメータを検索する前にすべての結果を検索するべきです。この場合、すべての結果に対してアクセスしたことを確保するためには、結果がなくなるまでSttement方法gets ResultSet、getsUpdateCount、get MoreResultsを呼び出す必要があります。すべての結果を検索したら、OUTパラメータの値をCallable Sttement.getXXX方法で検索することができます。7.1.5 OUTパラメータであるNULL値を検索してOUTパラメータに戻る値はJDBC NULLである可能性があります。このような場合、JDBC NULL値を変換して、getXXX方法で返される値がnull、0またはfalseとなるようにする。これは、getXXX方法の種類に依存する。ResultSetオブジェクトについては、0またはfalseがJDBC NULLから来ているかどうかを知る唯一の方法として、メソッドwasNullで検出します。もしgetXXXメソッドで読み取った最後の値がJDBC NULLであれば、この方法はtrueに戻り、そうでなければflaseに戻ります。第5節「ResultSet」については詳細をご案内します。