2 weixin 39540475 weixin_39540475 于 2017.09.01 16:49 提问

Mybatis怎么实现批量的id自增插入到oracle中

因为oracle中并不支持自增id,所以使用下面这种批量的先查询id,再把id的值加1后放到id字段中去,老是报ORA-00933: SQL 命令未正确结束,请大神帮帮忙。

 <insert id="addRoleInfo" parameterType="java.util.List" useGeneratedKeys="false" >  
        <selectKey resultType="int" keyProperty="ID" order="BEFORE">  
            SELECT  MAX(ID)+1 FROM PORTAL_SYSTEM_ROLE 
        </selectKey>  
        insert into PORTAL_SYSTEM_ROLE (ID,ROLE_ID,ROLE_NAME,CREATE_TIME,UPDATE_TIME)   
        values  
        <foreach collection="list" item="item" index="index" separator="," >  
               (#{item.id,jdbcType=VARCHAR},
                #{item.roleId,jdbcType=VARCHAR},
                #{item.roleName,jdbcType=VARCHAR},
                #{item.createTime,jdbcType=TIMESTAMP},
                #{item.updateTime,jdbcType=TIMESTAMP})  
        </foreach>  
    </insert>
 org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: java.sql.SQLException: ORA-00933: SQL 命令未正确结束

### The error may exist in file [E:\HTML\apache-tomcat-7.0.69\webapps\4asyn\WEB-INF\classes\mybatis\RoleMapper.xml]
### The error may involve com.boco.eoms.portal.role.mapper.RoleMapper.addRoleInfo-Inline
### The error occurred while setting parameters
### SQL: insert into PORTAL_SYSTEM_ROLE (ID,ROLE_ID,ROLE_NAME,CREATE_TIME,UPDATE_TIME)         values                         (?,     ?,     ?,     ?,     ?)         ,                (?,     ?,     ?,     ?,     ?)
### Cause: java.sql.SQLException: ORA-00933: SQL 命令未正确结束

; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-00933: SQL 命令未正确结束

4个回答

shui878412
shui878412   2017.09.02 08:53
已采纳

你可以试试这个:
TEST_USER
SEQ_TEST_USER_ID.nextval

 <!-- 注意这里直接调用sequence的nextval函数 -->
 <insert id="insert" parameterType="User">
     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
         values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
 </insert>


    或者参考下这个

        <insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List">  
    <selectKey resultType="long" keyProperty="id" order="AFTER">  
        SELECT  
        LAST_INSERT_ID()  
    </selectKey>  
    insert into t_train_record (add_time,emp_id,activity_id,flag)   
    values  
    <foreach collection="list" item="item" index="index" separator="," >  
        (#{item.addTime},#{item.empId},#{item.activityId},#{item.flag})  
    </foreach>  
</insert>  


    发现你的错误了吗? 对了  insert的sql中不用写id字段。
weixin_39540475
weixin_39540475 第二种方式是可以id自增的数据库,不适合oracle。我试过了mybatis是不支持批量查询id的max值然后加1这种方式的。还是谢谢你的回答
2 个月之前 回复
weixin_39540475
weixin_39540475 你说的第一种使用oracle的序列是可以批量插入的,但是这个项目是别人做好的表我不能添加东西,第二种方式
2 个月之前 回复
u014519461
u014519461   2017.09.07 07:41





SELECT MAX(ID)+1 FROM PORTAL_SYSTEM_ROLE


insert into PORTAL_SYSTEM_ROLE (ID,ROLE_ID,ROLE_NAME,CREATE_TIME,UPDATE_TIME)

select t.* from
(



(#{item.id,jdbcType=VARCHAR},
#{item.roleId,jdbcType=VARCHAR},
#{item.roleName,jdbcType=VARCHAR},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.updateTime,jdbcType=TIMESTAMP})



) t

weixin_39540475
weixin_39540475 还是谢谢你哦
2 个月之前 回复
weixin_39540475
weixin_39540475 这种是不能批量添加的,只能先查出id+1,然后放到对象的id属性再插入到数据库中去
2 个月之前 回复
u014519461
u014519461   2017.09.07 07:43





SELECT MAX(ID)+1 FROM PORTAL_SYSTEM_ROLE


insert into PORTAL_SYSTEM_ROLE (ID,ROLE_ID,ROLE_NAME,CREATE_TIME,UPDATE_TIME)

select t.* from (


#{item.id,jdbcType=VARCHAR},
#{item.roleId,jdbcType=VARCHAR},
#{item.roleName,jdbcType=VARCHAR},
#{item.createTime,jdbcType=TIMESTAMP},
#{item.updateTime,jdbcType=TIMESTAMP})

)t

u014519461
u014519461 回复GannnkKi: 之前看到你的代码也是要这么自增的,只是有点小细节导致语句报错。那你的批量ID自增是什么意思呢?
2 个月之前 回复
weixin_39540475
weixin_39540475 这种是不能批量添加的,只能先查出id+1,然后放到对象的id属性再插入到数据库中去,还是谢谢你哦
2 个月之前 回复
u014519461
u014519461   2017.09.11 19:55

之前看到你的代码也是要这么自增的,只是有点小细节导致语句报错。那你的批量ID自增是什么意思呢?

Csdn user default icon
上传中...
上传图片
插入图片