- PR -

『ORA-01461: LONG値はLONG列にのみバインドできます。』について

1
投稿者投稿内容
でかちょ
会議室デビュー日: 2007/11/07
投稿数: 13
投稿日時: 2008-07-29 18:23
いつもお世話になっております。

*クライアント Oracle10g 10.2.0.1.0
*データベース Oracle10g 10.2.0.3.0
*プログラム言語 VB.NET

上記環境にて開発を行っております。

あるテーブルに対してADO.NETを用いて、INSERTを行っているのですが、
稀に件名のエラーが発生します。
(日次タスクバッチなのですが、7月に二回ほど発生しました。)

INSERT方式はSQL文字列に"パラメータ名"を埋め込み、OracleCommandにセット。
その後、OracleCommand.Parameters("パラメータ名").Value = "パラメータ値"
にて、値を設定。
その後、ExecuteNonQueryです。

手動でのバッチ起動ではまったく再現せず、困っています。
どなたか、同じような現象に遭遇されたことはありませんでしょうか。

テーブル構造です。
----------------------------------------------------------
項目A VARCHAR2(12) NOTNULL
項目B DATE      NOTNULL
項目C NUMBER     NOTNULL
項目D VARCHAR2(4000)
項目E NUMBER
項目F CHAR(14)
項目G CHAR(14)
項目H CHAR(1)
----------------------------------------------------------

急な対応で書き漏れがあるかもしれません。
何か必要な情報があればご指示下さい。

宜しくお願い致します。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2008-07-30 07:26
エラーの場合にプログラムでINSERTデータを出力すれば
発生のパターンがわかると思います

同一データに対して手動で再現しないのでしょうか?
クライアントはシフトJISと思いますがDBの文字コードはわかりますか?
項目Dのデータが4000バイトをこえていませんか?

VB.NETとOracleのデータ型のマッピングでVARCHAR2の最大桁を
こえていたのでLONGになったと思われます
くろちゃん
会議室デビュー日: 2008/02/06
投稿数: 10
投稿日時: 2008-07-30 08:10
参考になるかわかりませんが、
Javaの場合では、
JDBCドライバーのバージョンも3.0なりに上げたらよかったような記憶があります。

[ メッセージ編集済み 編集者: くろちゃん 編集日時 2008-07-30 08:13 ]
でかちょ
会議室デビュー日: 2007/11/07
投稿数: 13
投稿日時: 2008-07-30 10:13
99ri様、くろちゃん様、早朝よりご返答有難うございます。

>同一データに対して手動で再現しないのでしょうか?
昨日も手動起動を多数行いましたが、再現しておりません。

>クライアントはシフトJISと思いますがDBの文字コードはわかりますか?
DBはJA16SJISでした。
クライアントの確認方法がわからなかったのですが、環境変数のNLS_LANGでよろしいのでしょうか?
上記ですと、現在は設定されていません。

>JDBCドライバーのバージョンも3.0なりに上げたらよかったような記憶があります。
早速、調べてみます。

見当違いなことを書き込んでいましたら、申し訳ありません。
本日も引き続き調べつつ、エラー時にINSERTデータを出力するよう対応したいと思います。

宜しくお願い致します。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-07-30 11:08
ORA-01461は結構複雑でやっかいな問題なので、サポート契約があれば公開情報を検索したり、問い合わせてみるのがよいと思います。
引用:

でかちょさんの書き込み (2008-07-30 10:13) より:
>JDBCドライバーのバージョンも3.0なりに上げたらよかったような記憶があります。
早速、調べてみます。


でかちょさんとこのシステムはJDBC関係ないので、これは調べなくてもいいと思います。

ORA-01461はJDBC固有の制限や問題で発生することもあって、さらにやっかいなのは事実なのですが。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2008-07-30 16:41
全く同一の事例に遭遇したことはないので多分に推測が多くなりますが……。


ORA-01461が出る状況は色々ややこしいケースが多いみたいなのですが、今回の場合、テーブル構成やバインド方法、ODP.NETを使っているというあたりを考えると、まず確認するのは単純にバインドしようとした文字列のサイズかな、と思います。
#このテーブル定義とODP.NET使用、という点を見る限り、文字コードはあまり今回は関係ないように思います。


ORA-01461は、VARCHAR2の最大値4000byteを超える文字列ををバインドしようとする時にLONGに変換(?)される事に由来して、『別にLONG値とか関係無いよ〜』とか思えるようなところで出てきたりするので、色々状況によってやっかいだったりします。

もっとも単純で、且つ、初めてだと面食らうと思うのは、VARCHAR2のカラム(任意のサイズ)に4001byte以上の文字列をバインドしようとした際でしょうか。

例えば、VARCHAR2(2000)のカラムに2001〜4000byteの文字列をバインドしようとすると、良くあるサイズオーバーのエラーが返ってくるのですが、4001byte以上の場合は返ってくるエラーがORA-01461になります。
これはバインドする際、対象の文字列がVARCHAR2の上限である4000byteを超える場合、内部的にLONGと見なしてバインドを試みるような動きをすることに由来するようです。


これらに加え、この状況に加え、文字コードやドライバの実装、Oracleのバージョン等も絡まって、さらにややこしい状況が出てきたりもするのですが、今回の場合はまず、本当に4000byteを超えるデータをバインドしようとしていなかったかどうか、について調べて見ることをお勧めしたいと思います。
でかちょ
会議室デビュー日: 2007/11/07
投稿数: 13
投稿日時: 2008-07-30 17:18
カーニー様、kiyokura様、ご返答有難うございます。

>サポート契約があれば・・・
ちょっと難しい感じです。

>VARCHAR2のカラム(任意のサイズ)に4001byte以上の文字列をバインドしようとした際でしょうか。
サンプルを作成し、確認してみようと思います。

すいません、追記ですがというか書き漏れですが、
プログラムは、テキストファイルを読み込み、DBに登録するという単純なものです。

エラーが発生したデータを用いても、手動で再現ができないのがなんとも・・・

引き続き、何か御座いましたら、宜しくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)