You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动