Cosminexus V9 アプリケーションサーバ 機能解説 互換編

[目次][用語][索引][前へ][次へ]

4.15 CallableStatementクラス

説明
CallableStatementクラスでは,主に次の機能を提供します。なお,CallableStatementクラスはPreparedStatementクラスのサブクラスです。PreparedStatementクラスおよびStatementクラスの機能をすべて継承します。
  • ストアドプロシジャの実行
  • INPUTおよびINOUTパラメタの設定(PreparedStatementクラスのsetXXXメソッドを使用)
  • INOUTおよびOUTPUTパラメタの登録
  • INOUTおよびOUTPUTパラメタ値の取得
CallableStatementクラスの提供する各メソッドの詳細および使用方法については,JavaSoft提供のJDBC関連ドキュメントを参照してください。

注意事項
  • CallableStatementクラスはPreparedStatementクラスのサブクラスであるため,PreparedStatementクラス,およびStatementクラスの注意事項はすべて該当します。PreparedStatementクラスおよびStatementクラスの注意事項を参照してください。
  • ResultSetを伴うストアドプロシジャ
    DABroker Libraryでは,ResultSetを伴うストアドプロシジャをサポートしていません。このため,getMoreResultsメソッドは無条件にfalseを返却し,getResultSetメソッドは無条件にnullを返却します。
  • ストアドプロシジャのOUTパラメタ取得
    setXXXメソッド,およびregisterOutParameterメソッドで設定した情報は,executeメソッド,executeUpdateメソッド,またはexecuteQueryメソッド実行後,getXXXメソッドを使用して必要なOUTパラメタをすべて取得し,それ以降その実行結果が不要になるまでは変更しないでください。OUTパラメタを取り出すときにパラメタの設定情報を参照するため,途中でclearParameterメソッドでパラメタの設定情報をクリアしたり,setXXXメソッド,およびregisterOutParameterメソッドでパラメタ情報を再設定したりすると,getXXXメソッドでエラーが発生しOUTパラメタの取得ができなくなります。
    (例)OUTパラメタを取得する前にclearParameterメソッドを実行した場合
    (実行するTEST_PROC(?)の?パラメタはREAL型のOUTパラメタとする)
    cstmt = con.prepareCall("{CALL TEST_PROC(?)}");
    cstmt.registerOutParameter(1, Types.REAL);  // OUTパラメタ情報の設定
    cstmt.execute();   // プロシジャ実行
    cstmt.clearParameter();   // パラメタ情報のクリア
    float float_value = cstmt.getFloat(1);   // OUTパラメタの取得,エラーの発生
    発生するエラー:KFDJ05006-E
    Output attribute is not able to acuire information because it does not exist in a parameter.
  • DECIMAL型使用時の注意事項
    DECIMAL型のOUTパラメタ,またはINOUTパラメタを設定するとき,小数点以下のけた数(以下スケール値)を受け入れない形式のregisterOutParameter(int parameterIndex,int sqlType)メソッドを使用するとスケール値は0とみなされます。
    また,INOUTパラメタへの設定は最後に実行したメソッドのスケール値が有効となります。そのためDECIMAL型のINOUTパラメタを設定する場合は,スケール値を受け入れない形式のregisterOutParameter(int parameterIndex,int sqlType)メソッドを先に設定したあとにsetBigDecimal(int parameterIndex,BigDecimal x)メソッドを設定,またはsetBigDecimal(int parameterIndex, BigDecimal x)メソッドを設定したあとにスケール値を受け入れる形式のregisterOutParameter(int parameterIndex,int sqlType,int scale)メソッドを設定してください。このとき,setBigDecimalメソッドに指定するjava.math.BigDecimalオブジェクトのスケール値,およびregisterOutParameterメソッドに指定するスケール値はデータベースに定義しているスケール値と同じにする必要があります。
(例1)registerOutParameterメソッドを先に設定する場合(定義長(15,5)とする)
cstmt.registerOutParameter(1, Types.DECIMAL);
cstmt.setBigDecimal(1, new java.math.BigDecimal("123.45000"));
(例2)scale付きregisterOutParameterメソッドを使用する場合(定義長(15,5)とする)
cstmt.setBigDecimal(1, new java.math.BigDecimal("123.45000"));
cstmt.registerOutParameter(1,Types.DECIMAL,5);
 
  • データベースから0バイトデータを取得する場合の注意事項
    データベースから0バイトデータを取得すると,nullが返されることがあります。発生条件を次に示します。
HiRDBの場合
次の条件が重なった場合に発生します。
  • データベースに格納されている0バイトデータを,ストアドプロシジャのOUTパラメタ,またはINOUTパラメタで取得する場合。
  • 列のデータ型が次のどれかの場合。
    VARCHAR
    NVARCHAR
    MVARCHAR
    BINARY
    BLOB
Oracleの場合
次の条件が重なった場合に発生します。
  • データベースに格納されている0バイトデータを,ResultSetクラス,ストアドプロシジャのOUTパラメタ,またはINOUTパラメタで取得する場合。
  • 列のデータ型が0バイトデータを格納できるデータ型の場合。

制限事項
DABroker Libraryで使用するCallableStatementクラスの制限事項を,次に示します。

表4-82 CallableStatementクラスの制限事項

メソッド名 制限事項 JDBC1.0での制限 JDBC2.0での制限
getArray SQL配列型をサポートしていないため,無条件にSQLExceptionをスローします。
getBlob 接続データベースがOracle9i,またはOracle10g以外の場合,SQL BLOB型をサポートしていないため,無条件にSQLExceptionをスローします。
getClob 接続データベースがOracle9i,またはOracle10g以外の場合,SQL CLOB型をサポートしていないため,無条件にSQLExceptionをスローします。
getRef SQL構造化型をサポートしていないため,無条件にSQLExceptionをスローします。

(凡例)
○:該当します。
−:該当しません。