バインド変数の値が 2000文字(ASCII)以上のになるものが複数存在すると、何故か「ORA-01461: LONG値はLONG列にのみバインドできます。」が発生します。
ORACLE 10g, 11g では発生しません。
サンプルクエリ
create table TEST ( PK number(3,0) not null primary key, CONTENT1 varchar2(4000), CONTENT2 varchar2(4000), CONTENT3 varchar2(4000) ) / insert into TEST values (:PK, :CONTENT1, :CONTENT2, :CONTENT3) / select PK, CONTENT1, CONTENT2, CONTENT3, LENGTH(CONTENT1), LENGTH(CONTENT2), LENGTH(CONTENT3) from TEST / drop table TEST /
結果 | CONTENT1 | CONTENT2 | CONTENT3 |
NG | 4000 | 4000 | 4000 |
NG | 2000 | 2000 | 0 |
OK | 1999 | 2000 | 1999 |
OK | 1999 | 4000 | 1999 |
ODP.NET 4 で発生しましたが、他のアプリ(SI Object Browser)でも発生しているので、ODP.NET の問題では無いと思います。
また、文字数は体験談で公式ではありません。公式のドキュメントがどこかにあるのかな?
とりあえずの回避方法としてバインド変数を増やして、クエリ内で文字列結合で逃げれます。。
insert into TEST values (:PK, :CONTENT1_1 || :CONTENT1_2 || :CONTENT1_3 || :CONTENT1_4, ...)