我需要从java向Oracle数据库插入特定的时间戳; 我的oracle列ChangeTime是DATA_TYPE = TIMESTAMP(6),期望值格式为 - 08-APR-16 09.52.22.000000000 AM。
我已经在我的java代码中将java.sql.Timestamp转换为字符串:
String changeTimestamp = new Timestamp(System.currentTimeMillis()).toString();
我的SQL PreparedStatement如下:
<property name="updatePersonDetail">
<bean class="com.cigna.ibor.dao.UpdateWithParameters" parent="dao.template">
<constructor-arg ref="mydb.ds" />
<constructor-arg>
<value>
<![CDATA[
UPDATE MYDB.INDIV_DETAIL
SET PERSON_ID =?
, LAST_OPER_ID = ?
, LAST_TIMESTMP = ?,
WHERE SRC_LOC_CD = ?
AND SRC_SYS_ID = ?
]]>
</value>
</constructor-arg>
<constructor-arg>
<list>
<ref local="java.sql.Types.VARCHAR" />
<ref local="java.sql.Types.VARCHAR" />
<ref local="java.sql.Types.VARCHAR" />
<ref local="java.sql.Types.VARCHAR" />
<ref local="java.sql.Types.VARCHAR" />
</list>
</constructor-arg>
</bean>
</property>
我在运行时遇到 java.sql.SQLDataException:ORA-01843:无效月份。 任何帮助表示赞赏!
答案 0 :(得分:0)
如果您的字符串格式为08-APR-16 09.52.22.000000000 AM
,那么您可以指定格式而不是依赖隐式转换:
UPDATE MYDB.INDIV_DETAIL
SET PERSON_ID =?
, LAST_OPER_ID = ?
, LAST_TIMESTMP = TO_TIMESTAMP(?, 'DD-MON-RR HH:MI:SS.FF9 AM'),
WHERE SRC_LOC_CD = ?
AND SRC_SYS_ID = ?
格式模型必须与您实际传递的内容相匹配。听起来你假设这是会话的NLS_TIMESTAMP_FORMAT设置,但错误表明情况并非如此。不要混淆客户端/ IDE如何显示查询的日期/时间戳与存储方式 - 没有内在格式,Oracle使用的内部表示与显示的值完全不同。
即使这样,您也假设Oracle会话的数据语言与Java值匹配 - 例如,它们都使用英文月份名称。如果您不确定数据库会话的日期语言是什么,但是知道Java字符串始终是英语,您可以specify that in the conversion:
, LAST_TIMESTMP = TO_TIMESTAMP(?, 'DD-MON-RR HH:MI:SS.FF9 AM'
, 'NLS_DATE_LANGUAGE=ENGLISH'),
如果您有一个Java时间戳值,当前正在将其转换为该格式的字符串以进行此调用,您可以将其作为时间戳传递给,而不是将其转换为字符串和从字符串转换。