- PR -

全角文字を使用したINSERT(UPDATE)でORA-01461エラー

1
投稿者投稿内容
skt
会議室デビュー日: 2004/12/06
投稿数: 12
投稿日時: 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");
}
}
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2006-07-10 09:45
引用:

sktさんの書き込み (2006-07-09 17:49) より:
<発生エラー>
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)


 オラクルの吐いているメッセージについて調べてみたのでしょうか?

http://software.fujitsu.com/jp/cobol/faq/trouble_answer/error0012.html

まずは、やるべきことをやりましょうね。
skt
会議室デビュー日: 2004/12/06
投稿数: 12
投稿日時: 2006-07-10 10:05
引用:

takuさんの書き込み (2006-07-10 09:45) より:
 オラクルの吐いているメッセージについて調べてみたのでしょうか?

http://software.fujitsu.com/jp/cobol/faq/trouble_answer/error0012.html

まずは、やるべきことをやりましょうね。



お示しいただいたURLを拝見しましたが、
私が最初に書きました通り、JDBC−ODBCブリッジドライバではなくthinドライバを使用しているため、根本的な解決策とはなりません。
ただ、「Unicode〜」との記述を見る限り、内部で文字化けor文字コード変換不正が発生しているのかと推測できますね。
ご指摘ありがとうございます。


skt
会議室デビュー日: 2004/12/06
投稿数: 12
投稿日時: 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行が選択されました。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2006-07-10 10:33
引用:

sktさんの書き込み (2006-07-10 10:05) より:
引用:

takuさんの書き込み (2006-07-10 09:45) より:
 オラクルの吐いているメッセージについて調べてみたのでしょうか?

http://software.fujitsu.com/jp/cobol/faq/trouble_answer/error0012.html

まずは、やるべきことをやりましょうね。



お示しいただいたURLを拝見しましたが、
私が最初に書きました通り、JDBC−ODBCブリッジドライバではなくthinドライバを使用しているため、根本的な解決策とはなりません。
ただ、「Unicode〜」との記述を見る限り、内部で文字化けor文字コード変換不正が発生しているのかと推測できますね。
ご指摘ありがとうございます。


 私が提示したURLからすると、新しいJDBCドライバを使用することで、
問題が解決すると思うのですが・・・。
どこにTYPE1なんぞを前提とした話をする輩がいるのでしょうかね・・・。

まずはオラクルのサイトで、この事象に関する記述を見つけましょうね。
だから、やるべきことをやっていないと言っているのです。
skt
会議室デビュー日: 2004/12/06
投稿数: 12
投稿日時: 2006-07-10 11:09
引用:

takuさんの書き込み (2006-07-10 10:33) より:
私が提示したURLからすると、新しいJDBCドライバを使用することで、
問題が解決すると思うのですが・・・。
どこにTYPE1なんぞを前提とした話をする輩がいるのでしょうかね・・・。

まずはオラクルのサイトで、この事象に関する記述を見つけましょうね。
だから、やるべきことをやっていないと言っているのです。



ご返信ありがとうございます。
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さんのおっしゃる「この事象に関する記述」とは具体的にどちらを指しているのかご教授願えますでしょうか?
skt
会議室デビュー日: 2004/12/06
投稿数: 12
投稿日時: 2006-07-10 11:21
解決いたしました。
こちらの作業ミスで、最新のojdbc14.jarを取ってきたにもかかわらず、クラスパスに通さずにテストしておりました・・・。
最新のojdbc14.jarをクラスパスに通してテストしたところ、正常動作いたしました。
原因は「OracleのバージョンとJDBCのバージョンのミスマッチ」ということでしょうか。

takuさん、度々ご返信いただきありがとうございました。
また機会があればご指導よろしくお願いいたします。
1

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