- PR -

SHIFT_JISテキストを分割してUTF-8のDBに正常に格納したい

1
投稿者投稿内容
ショッカー
会議室デビュー日: 2008/07/01
投稿数: 4
投稿日時: 2008-12-24 16:47
いつもお世話になっております。
DBと長文のテキストをやりとりする際に
SQLでエラーが発生し困っています。

開発環境:
Struts 1.3
ibatis 2.3.0
Eclipse 3.2
JDK 1.5
oracle10g

【やりたいこと】
2660文字が制限のテキストエリアがあり、そこから
送られてくる文章を、分割して改行コードも含め正常にDBに登録したい

【入力されたテキスト】
SHIFT_JISで改行なしの全角文字1334文字

【SQLの分割処理】
UPDATE
MENU
SET
MENU_TEXT1 = SUBSTR(#menuText#,0,1332),
MENU_TEXT2 = NVL(SUBSTR(#menuText#,1333),NULL)
WHERE
CUSTOMER_ID = #customerId#
AND
MENU_ID = #menuId#

※MENU_TEXT1、MENU_TEXT2ともにVARCHAR2(4000)

上記分割処理を行うと、
「ORA-01461: LONG値はLONG列にのみバインドできます。」
というエラーで処理が落ちてしまいます。

UTF-8のDBなので、全角1文字を3バイトとみて、1334×3=4002バイト
となって4000バイト上限を超えて落ちているのでしょうか?

上記SQLでの分割処理ではなく、Javaで分割をしDBに格納する方法を
試すと問題なく分割されて入るようです。

【Javaの分割処理】
※getMenuTextDisp()は本文中の改行コードを<br />に変更したものです

// テキスト本文が1332文字より長い場合
if (menuForm.getMenuTextDisp().length > 1332 ) {

// 1332文字までの本文を設定する
menuText = menuForm.getMenuTextDisp().substring(0, 1332);

// 1333文字から2660文字までの文字を本文2に設定
secondMenuText = menuForm.getMenuTextDisp().substring(1332);
}
この時のSQL文は以下
UPDATE
MENU
SET
MENU_TEXT1 = #menuText#,
MENU_TEXT2 = NVL(#secondMenuText#,NULL)
WHERE
CUSTOMER_ID = #customerId#
AND
MENU_ID = #menuId#

Javaの分割処理で一応は解決しましたが、上記SQLでの分割についての解決法、
また、Javaで分割した際の問題点などございましたらご教授お願いします。
長文失礼しました。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2008-12-24 18:34
分割されないデータの場合はエラーは発生しないのでしょうか?

また、
ORA-01461で検索したときに一番上に表示される
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31968&forum=12&6
とかも関係ありませんか?
1

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