一、错误说明
新项目要使用达梦,遇到奇奇怪怪的问题
报错记录:
-6102:数据溢出
总共1个语句正依次执行...
[执行语句1]:
MERGE INTO T_ROAD_LIST T1
USING (
SELECT
'********' AS ROAD_ID,
'********' AS ROAD_NAME,
10 AS BERTH_COUNT,
1669259479000 AS UPDATE_TIME
FROM DUAL
) T2 ON (T1."ROAD_ID" = T2.ROAD_ID)
WHEN MATCHED THEN
UPDATE SET
T1."ROAD_NAME" = T2.ROAD_NAME,
T1."BERTH_COUNT" = T2.BERTH_COUNT,
T1."UPDATE_TIME" = T2.UPDATE_TIME
WHEN NOT MATCHED THEN
INSERT ("ROAD_ID", "ROAD_NAME", "BERTH_COUNT", "UPDATE_TIME")
VALUES (T2.ROAD_ID, T2.ROAD_NAME, T2.BERTH_COUNT, T2.UPDATE_TIME);
执行失败(语句1)
-6102: 数据溢出
思前想后,能出问题的就是日期这个点了,其实我在其他merge 或者insert语句并未遇到这个问题,时间戳也是可以正常插入,但是既然这里需要这么写就只能更换日期的写法。
二、修改过程
我手动把日期更改
我是通过hashmap传值,在xml的映射里
<foreach collection="map.data" item="value" index="key" separator=",">
#{value} "${key}"
</foreach>
自动将hashmap的键值对映射进SQL语句,既然如此只能手动修改了。
修改为手动映射字段:
MERGE INTO ${map.tableName} T1 USING (
SELECT
'${map.data.ROAD_ID}' AS ROAD_ID,
'${map.data.ROAD_NAME}' AS ROAD_NAME,
${map.data.BERTH_COUNT} AS BERTH_COUNT,
TO_DATE('${new java.util.Date(map.data.UPDATE_TIME)}', 'YYYY-MM-DD HH24:MI:SS') AS UPDATE_TIME
<!-- <foreach collection="map.data" item="value" index="key" separator=",">-->
<!-- #{value} "${key}"-->
<!-- </foreach>-->
FROM dual
) T2
手动修改后依然报错:
### Cause: dm.jdbc.driver.DMException: 年份值必须介于 -4713 和 +9999 之间, 且不为 0
这个莫名其妙的错误我也无法确认时间 ,因为数据的时间大概是2022-2023年。
Java中有java.util.date和java.sql.date两种
于是我决定使用第二种日期格式来尝试转化。
用第二种存入达梦的时间为“2022-01-01”
但是我的时间戳一定是精确到秒的。
说明这个方法也不可以,于是做出了进一步的更改:
TO_DATE('${new java.sql.Timestamp(map.data.UPDATE_TIME)}', 'YYYY-MM-DD HH24:MI:SS') AS UPDATE_TIME
终于获得了正确的形如 2023-08-03 15:24:49 的时间。
以此为记。