问题描述
Oracle批量merge,如下
MERGE INTO TABLE t
USING (
<foreach collection="infoList" item="info" separator="union all">
SELECT #{info.id} AS id,
#{info.code} AS code,
#{info.name} AS name
FROM dual
</foreach>
) t1
ON (t.code = t1.code AND t.name = t1.name)
WHEN NOT MATCHED THEN
INSERT (id,code,name) VALUES(t1.id,t1.code,t1.name)
编写测试方法进行测试,报错“must have same datetype as corresponding expression”
原因分析
UNION ALL 连接了多个select 语句时会报错,现在虽然是merge操作,但用UNION ALL 连接了多个select 语句,故有可能会出现错误。错误原因
错误1:字段名没对齐
错误2:每个字段对应的数据类型不一样
解决方法
针对错误一,字段名一一对应即可,本例不存在这个问题。
针对错误二,需要确定字段类型,如下
MERGE INTO TABLE t
USING (
<foreach collection="infoList" item="info" separator="union all">
SELECT #{info.id,jdbcType=VARCHAR} AS id,
#{info.code,jdbcType=VARCHAR} AS code,
#{info.name,jdbcType=VARCHAR} AS name
FROM dual
</foreach>
) t1
ON (t.code = t1.code AND t.name = t1.name)
WHEN NOT MATCHED THEN
INSERT (id,code,name) VALUES(t1.id,t1.code,t1.name)
注意
- 字段类型的获取应该从JdbcType枚举类中获取。如果填VARCHAR2,会提示没有这个类型。
- JdbcType.DATE只显示日期,如果存入年/月/日 时:分:秒,则应该使用JdbcType.TIMESTAMP