Java SQL エンジニア

【nullに注意】ORA-00932: データ型が一致しません: NUMBERが予想…の解決方法

Javaで扱うSQLのupdateやinsert文でめちゃくちゃに沼った、、、、

EntityやDtoのデータ型が一致しているはずなのに「ORA-00932: データ型が一致しません」のエラーが発生

SQLを条件分岐させることで回避に成功したので備忘録として

あれやこれやと調べまわり該当しそうな原因を確認したけど解消されない、、

このエラーで一日近く無駄にしてしまった。。。

結論 BigDecimal型のnullデータのセット時に発生する

今回の私のケースではBigDecimal型でしたが、もしかすると他の型でも発生するかもしれません。

エラーが発生したJava SQLコードの概要

StringBuilder sb = new StringBuilder();
sb.append(“ INSERT INTO TABLEXX (A , B , C) “);
sb.append(“ VALUES(:String, :String ,:BigDecimal) “);

SQLQuery exQuery = session.createSQLQuery(sb.toString);

exQuery.setParameter(“BigDecimal”,XXdto.getHoge());

のようになっていました。

一見というか普通に問題無いように思います、

各項目にデータが存在する場合はエラーになりません

しかしBigDecimal型のデータがnullの場合データ型が一致しませんのエラーが引き起こされてしまうのです

対策 SQLのnull判定で分岐させる

エラーを回避できるJava SQL

StringBuilder sb = new StringBuilder();

sb.append(“ INSERT INTO TABLEXX (A , B , C) “);
sb.append(“ VALUES(:String, :String “ );
if(XXdto.getHoge() == null){
	sb.append(“ , null “ );    //nullを直接セットする
}else{
        sb.append(“ ,:BigDecimal “ );  //データがある場合は従来の記述
}

SQLQuery exQuery = session.createSQLQuery(sb.toString);

if(XXdto.getHoge() != null){
	exQuery.setParameter(“BigDecimal”,XXdto.getHoge());

データがある場合とnullの場合に分けてメインのSQLとパラメータの設定を条件分岐させます。

そうすることでBigDecimal型のnullが引き起こすエラーを回避出来ます

正直なぜダメなのか良くわかっていないので明確な理由が分かったら追記します。

-Java, SQL, エンジニア