4

SpringjdbcTemplate.update(String sql, Object[] args)を使用して、Oracleデータベースで準備された挿入ステートメントを実行しています。オブジェクトの1つは値「Y」を含むCharacterオブジェクトであり、ターゲット列はCHAR(1)タイプですが、

java.sql.SQLException: Invalid column type

例外。

私はこれを前後にデバッグしましたが、問題を引き起こしているのはこの1つの特定のオブジェクトであることは間違いありません。この文字オブジェクトを省略すると、挿入は期待どおりに実行されます。

sqlとObject[]の値を出力し、sqlをsqldeveloperにコピーし、値のプレースホルダー(?'s)をオブジェクトの実際の値に置き換えることもできます。挿入は正常に機能します。

SQL(有罪を保護するために難読化):

INSERT INTO SCHEMA.TABLE(NUMBER_COLUMN,VARCHAR_COLUMN,DATE_COLUMN,CHAR_COLUMN) VALUES (?,?,?,?);

オブジェクトの値:

values[0] = [123]
values[1] = [Some String]
values[2] = [2012-04-19]
values[3] = [Y]

組み合わせはSQLDeveloperで手動で実行され、それは問題なく機能します。

INSERT INTO SCHEMA.TABLE(NUMBER_COLUMN,VARCHAR_COLUMN,DATE_COLUMN,CHAR_COLUMN) VALUES (123,'Some String','19-Apr-2012','Y');

プリペアドステートメントSQL自体は、データ転送オブジェクト内に含まれるnull以外のインスタンス変数オブジェクトに基づいて動的に生成されるため(データベースでデフォルト値の生成を処理する必要があります)、 sqlまたは挿入ルーチン。

誰もがこれに遭遇し、何が起こっているのか、そしてそれを修正する方法を私に説明することができますか?CHAR(1)フィールドにCharacterオブジェクトを挿入できないように見えるのはイライラするほど奇妙です。どんな助けでも大歓迎です。

よろしくお願いいたします。長年のLurkerの初めてのポスター

4

1 に答える 1

2

文字値をとるPreparedStatement.setXxx()はなく、Oracleドキュメントには、すべてのJDBC文字タイプがJava文字列にマップされると記載されています。また、http://docs.oracle.com/javase/1.3/docs/guide/jdbc/getstart/mapping.html#1039196charを参照してください。これには、JavaまたはCharacterJDBCタイプへのマッピングは含まれていません。

値を文字列に変換する必要があります。

于 2012-05-24T23:40:39.617 に答える