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をスローします。
−
○