1. はまったこと
- レジストリー変数「DB2_COMPATIBILITY_VECTOR」の設定値によって、SQLCODE=-302, SQLSTATE=22001 が発生したりしなかったり
2. 起きたこと
2.1. 条件とか
- IBM DB2 v10.5 Express-C
- Table
> db2 describe table foo
データ・タイ データ・ 列の スケ
列名 プ・スキーマ タイプ名 長さ ール NULL
---------- ------------ ------------ ------ ----- -----
ID SYSIBM INTEGER 4 0 いいえ
NAME SYSIBM VARCHAR 10 0 いいえ
- Data
ID NAME
---- ----------
1 John
2 Paul
-
Query
select id, name from foo where name = ?
-
name = ?にNAME列の長さ10を超える値を設定
例えば、「John」ならID=1, NAME=Johnのレコードが取得できるけど、「Pauuuuuuuul」なら対象レコードないはず -
DB2_COMPATIBILITY_VECTORの設定値を変更する
MYS
ORA
SYB
設定なし
2.2. 結果
- MYS、ORA、SYB
対象レコードなし
例外発生しない
- 設定なし
以下のようなSQLExceptionが発生した
com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=4.18.60
SQL0302N
EXECUTE または OPEN ステートメント内のホスト変数の値が、対応する使用の範囲外にあります。
http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.messages.sql.doc/doc/msql00302n.html?lang=ja
3. 反省すること
-
SQL0302N
このエラー自体があることは知ってた..>_<..
http://db2.jugem.cc/?eid=1850 -
DB2_COMPATIBILITY_VECTORのデフォルト
DB2 Express-Cで試していたが、最初に入れたサンプルデータベースで「DB2_COMPATIBILITY_VECTOR」のデフォルトがMYSになっていた..>_<.. -
IBM Knowledge Centerの記載
MYSは「LIMIT 節と OFFSET 節の有効化のみ」と記載あるので原因ではないと思ってしまった..>_<..
http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.porting.doc/doc/r0052867.html?lang=ja
おわり。