ORA-00932数据类型不一致问题:如何在Java中将java.sql.Timestamp转换为指定格式字符串适配Oracle查询
ORA-00932数据类型不一致问题:如何在Java中将java.sql.Timestamp转换为指定格式字符串适配Oracle查询
嘿,这个错误的根源其实很清晰——Oracle的coalesce函数要求所有传入的参数数据类型必须完全一致。你现在的查询里,默认值是字符串类型的'01-JAN-01 01:01:01.000000 AM',但Java端传的是java.sql.Timestamp日期类型,两种类型不匹配,直接触发了ORA-00932错误。
给你两种靠谱的解决方向,按需选择:
方向一:在Java端把Timestamp转成目标格式的字符串
如果一定要保持现有查询不变,那你需要把last_run_date转换成和默认值格式完全一致的字符串,再作为字符串参数传入。推荐用Java 8+的DateTimeFormatter(线程安全,比旧的SimpleDateFormat更可靠):
import java.time.format.DateTimeFormatter; import java.time.LocalDateTime; import java.sql.Timestamp; import java.util.Locale; // 定义匹配目标格式的格式化器,指定英文Locale避免月份缩写乱码 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yy hh:mm:ss.SSSSSS a", Locale.ENGLISH); // 将java.sql.Timestamp转成LocalDateTime LocalDateTime localDateTime = last_run_date.toLocalDateTime(); // 格式化成目标字符串 String formattedDate = localDateTime.format(formatter); // 以字符串类型传入参数 query.setParameter(1, formattedDate);
如果是Java 8之前的版本,用SimpleDateFormat也可以,但要注意它不是线程安全的,尽量在方法内部创建实例:
import java.text.SimpleDateFormat; import java.sql.Timestamp; import java.util.Locale; SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy hh:mm:ss.SSSSSS a", Locale.ENGLISH); String formattedDate = sdf.format(last_run_date); query.setParameter(1, formattedDate);
方向二:修改Oracle查询,统一参数类型(更推荐)
其实更合理的做法是让coalesce的两个参数都是TIMESTAMP类型,这样Java端直接传java.sql.Timestamp就行,不需要做格式转换,还能避免字符串格式不匹配的坑。修改查询如下:
SELECT to_timestamp(TO_CHAR(CAST(coalesce(?, TO_TIMESTAMP('01-JAN-01 01:01:01.000000 AM', 'DD-MON-YY HH:MI:SS.FF6 AM')) AS TIMESTAMP), 'DD-MON-YY HH24MISS')
这里把原来的字符串默认值用TO_TIMESTAMP转成了TIMESTAMP类型,和你传入的参数类型一致,coalesce就能正常工作了,Java端直接保留query.setParameter(1, last_run_date, TemporalType.TIMESTAMP);即可。
个人更推荐第二种方式,因为日期类型直接传递比转字符串更可靠,还能减少Java端的代码复杂度~
备注:内容来源于stack exchange,提问作者JavaJo




