ORA-24816の対処。

今日、初めて見た。事象と対処法だけメモ。

事象

BLOB列とVARCHAR2(4000)列を持つAテーブルに、それぞれ最大サイズのデータをINSERTしようとしたところ、ORA-24816発生。

ORA-24816: 実際のLONGまたはLOB列の後に、指定されたLONG以外のバインド・データが拡張されました

閾値は見てないけど、こんな感じで事象再現。
・BLOB列:8000バイト、VARCHAR2(4000)列:4000バイトだと再現
・BLOB列:1000バイト、VARCHAR2(4000)列:4000バイトだと再現しない
・BLOB列:8000バイト、VARCHAR2(4000)列:1000バイトだと再現しない

対処法

回避方法は、INSERT、UPDATEのカラム順をLOB型を最後に配置するようにすると成功したと書かれていました。
とりあえず検証したところ、問題なく登録できましたしました。。

#ORA-24816
 insert into TABLE01(data2, title, data1, id)values(?, ?, ?, ?)
#成功
 insert into TABLE01(id, title, data1, data2)values(?, ?, ?, ?)
(UPDATEも同様に成功)

Oracle Technology Network (OTN) Japan - 掲示板 : ORA-24816: ...

ホントかよ、と疑いながらBLOB列を後ろにしたら解決。
S2JDBCの制約上、一番後ろにはできなかったけどVARCHAR2(4000)列の後ろにしたら再現しなかったので解決ってことで。