Hitachi

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


18.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クラスの制限事項を,次に示します。

表18‒82 CallableStatementクラスの制限事項

メソッド名

制限事項

JDBC1.0での制限

JDBC2.0での制限

getArray

SQL配列型をサポートしていないため,無条件にSQLExceptionをスローします。

getBlob

接続データベースがOracle9i,またはOracle10g以外の場合,SQL BLOB型をサポートしていないため,無条件にSQLExceptionをスローします。

getClob

接続データベースがOracle9i,またはOracle10g以外の場合,SQL CLOB型をサポートしていないため,無条件にSQLExceptionをスローします。

getRef

SQL構造化型をサポートしていないため,無条件にSQLExceptionをスローします。

(凡例)

○:該当します。

−:該当しません。