- - PR -
全角文字を使用したINSERT(UPDATE)でORA-01461エラー
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-09 17:49
題記の件、INSERT(もしくはUPDATE)でCHAR型、VARCHAR2型の項目に全角文字を設定すると、
ORA-01461エラーが発生してしまいます。 とりあえずの回避策として、バインド変数を使用せず、 Statement.executeUpdate(sql)にて同様のSQLを実行すれば、 正常に更新されることを確認しています。 上記エラーコードをネット上にて調べたのですが、同じような事象は見当たらず、 また「PreparedStatementで全角文字をバインドして更新するとエラーになる」 という話は、私の周りでは聞いたことが無い為、対処法に行き詰っております。 皆様からのご助言をお待ちしております。 <環境> OS:Windows2003 DB:Oracle10g JAVA:JDK1.4.2_06 JDBC:ojdbc14.jar <発生エラー> java.sql.SQLException: ORA-01461: LONG値はLONG列にのみバインドできます。 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:623) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181) at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:543) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1028) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2888) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2960) <使用TABLE> CREATE TABLE TBL_TEST ( NO NUMBER(3) NOT NULL, ID CHAR(10), NAME VARCHAR2(10) ); ALTER TABLE TBL_TEST ADD ( CONSTRAINT TBL_TEST_PK PRIMARY KEY (NO) ); <Javaソース> import java.sql.*; public class Test { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection(); pstmt = conn.prepareStatement("INSERT INTO TBL_TEST (NO, ID, NAME) VALUES (?, ?, ?)"); pstmt.setInt(1, Integer.parseInt(args[0])); pstmt.setString(2, args[1]); //ここで全角を設定するとNG(半角はOK) pstmt.setString(3, args[2]); //ここで全角を設定するとNG(半角はOK) int count = pstmt.executeUpdate(); } catch (Exception e) { if (conn != null) { try { conn.rollback(); } catch (Exception ex) { } } e.printStackTrace(); } finally { if (pstmt != null){ try { pstmt.close(); } catch(Exception e){} } if (conn != null) { try { conn.close(); } catch (Exception e) { } } } } private static Connection getConnection() throws Exception { Class.forName("oracle.jdbc.driver.OracleDriver"); return DriverManager.getConnection("jdbc:oracle:thin:@[IP]:[PORT]:[DBNAME]", "user", "pass"); } } | ||||||||
|
投稿日時: 2006-07-10 09:45
オラクルの吐いているメッセージについて調べてみたのでしょうか? http://software.fujitsu.com/jp/cobol/faq/trouble_answer/error0012.html まずは、やるべきことをやりましょうね。 | ||||||||
|
投稿日時: 2006-07-10 10:05
お示しいただいたURLを拝見しましたが、 私が最初に書きました通り、JDBC−ODBCブリッジドライバではなくthinドライバを使用しているため、根本的な解決策とはなりません。 ただ、「Unicode〜」との記述を見る限り、内部で文字化けor文字コード変換不正が発生しているのかと推測できますね。 ご指摘ありがとうございます。 | ||||||||
|
投稿日時: 2006-07-10 10:19
<補足情報>
DBのNLSパラメータは下記の通りです。 SQL> SELECT * FROM NLS_DATABASE_PARAMETERS 2 WHERE PARAMETER LIKE 'NLS_%'; PARAMETER VALUE ------------------------------ ---------------------------------------------------- NLS_LANGUAGE AMERICAN NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET JA16SJIS NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY PARAMETER VALUE ------------------------------ ---------------------------------------------------- NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_RDBMS_VERSION 10.1.0.4.0 20行が選択されました。 | ||||||||
|
投稿日時: 2006-07-10 10:33
私が提示したURLからすると、新しいJDBCドライバを使用することで、 問題が解決すると思うのですが・・・。 どこにTYPE1なんぞを前提とした話をする輩がいるのでしょうかね・・・。 まずはオラクルのサイトで、この事象に関する記述を見つけましょうね。 だから、やるべきことをやっていないと言っているのです。 | ||||||||
|
投稿日時: 2006-07-10 11:09
ご返信ありがとうございます。 JDBCドライバについては、現在 http://otn.oracle.co.jp/software/tech/java/jdbc/1020/jdbc1020.html に公開されている最新の ojdbc14.jar、およびDBサーバにインストールされているOracleに付属の ojdbc14.jar で共にテストして同様のエラーが発生することを確認しております。 私がサイトから収集した情報では、 1.Bug#3631763:日本語キャラクタ・セットの使用時に大きい文字列をバインドすると、ORA-01461が発生します。(READMEより) を確認しております。 2.サーバのキャラクタセットによりVARHCAR2型の長さに制限があり、この長さ以上の文字列を指定するとORA-01461が発生する。 ことを確認しております。 また、現在下記をテスト中です。 1.OCI接続方式での動作確認 2.他フロア/他PJTのマシンで同じアプリを動かしてもらう。 ※2については、正常動作する環境もあることを確認しております。その環境と私がいる環境では Oracleの "NLS_RDBMS_VERSION" に差異があることを確認しております。 (私の環境は "10.1.0.4.0"、正常動作した環境は "10.1.0.2.0") 現在、バージョン間の差異で挙動が変わったしまうのかを情報収集していることころです。 takuさんのおっしゃる「この事象に関する記述」とは具体的にどちらを指しているのかご教授願えますでしょうか? | ||||||||
|
投稿日時: 2006-07-10 11:21
解決いたしました。
こちらの作業ミスで、最新のojdbc14.jarを取ってきたにもかかわらず、クラスパスに通さずにテストしておりました・・・。 最新のojdbc14.jarをクラスパスに通してテストしたところ、正常動作いたしました。 原因は「OracleのバージョンとJDBCのバージョンのミスマッチ」ということでしょうか。 takuさん、度々ご返信いただきありがとうございました。 また機会があればご指導よろしくお願いいたします。 |
1