关于mybatis的 insert into select 命令未结束问题

本文探讨了在使用Mybatis时遇到的INSERT INTO SELECT语句执行异常的情况,虽然SQL在PLSQL环境下运行正常,但在Mybatis中出现错误。问题最终定位为配置设置问题,官方建议开启JDBC自动生成主键的支持,以确保驱动兼容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于mybatis的 insert into select 命令未结束问题,最后以为是sql写错了,但是,在plsql执行又没问题。最后还是解决问题,

是设置问题。

### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

原先的配置:

  <insert id="addHistoryByPostBatchno" parameterType="paramMap" >

修改了以后,加了
 useGeneratedKeys="false"

<insert id="addHistoryByPostBatchno" parameterType="paramMap" useGeneratedKeys="false" >
 	 Insert into 
	  Tb_Dispatch_Mail_History
	  (
		  mail_no, rec_name, rec_address, rec_telephone, 
		  customer_no, post_opter, mail_content_name, mail_weight,
		  actual_postage, delivery_area, post_time, post_condition,
	      post_status, post_batchNo, customer_id
	   ) 
	  select 
		   mail_no, rec_name, rec_address, rec_telephone, 
		   customer_no, post_opter, mail_content_name, mail_
### MyBatis 中 `INSERT INTO ... SELECT` 语句的使用 在 MyBatis 中,可以利用动态 SQL 和 `<insert>` 标签来执行复杂的插入操作,其中包括基于查询的结果集进行数据插入的操作。对于 `INSERT INTO ... SELECT` 类型的操作,可以通过编写相应的 XML 映射文件中的 SQL 片段完成。 #### 动态构建 SQL 插入语句 为了实现从一个表中选择特定条件的数据并将其插入到另一个表中,在映射文件里定义如下形式的 SQL: ```xml <insert id="copyUsersByCondition" parameterType="map"> INSERT INTO target_table (column1, column2, ...) SELECT source_column1, source_column2, ... FROM source_table WHERE condition = #{conditionValue} </insert> ``` 此代码片段展示了如何创建一条新的记录集合,并将这些新纪录插入目标表格内;同时允许传递参数用于控制源表的选择逻辑[^3]。 当涉及到更复杂的情况时,比如需要处理多条记录之间的关联关系或者是跨多个数据库实例的情况下,则可能还需要考虑事务管理以及批量操作等问题。 #### 实际案例分析 假设存在两个结构相似但名称同的用户信息表:一个是旧系统的遗留数据存储位置 (`old_user`) 另一个是当前正在使用的系统所维护的新版用户列表(`new_user`). 需要定期同步部分符合条件的老用户的资料至新版用户表中. 此时就可以采用上述提到的方式来进行迁移工作: ```xml <!-- 将满足一定条件下 old_user 表里的用户复制到 new_user --> <insert id="syncOldToNewUsers" parameterType="java.util.Map"> INSERT INTO new_user ( user_id, username, email, created_at ) SELECT ou.user_id, ou.username, ou.email, CURRENT_TIMESTAMP() FROM old_user AS ou LEFT JOIN new_user nu ON ou.user_id = nu.user_id WHERE ou.status = 'active' AND nu.user_id IS NULL; </insert> ``` 这段脚本会把所有状态标记为活跃且尚存在于新版用户表内的老用户添加进来,确保会重复导入相同 ID 的记录.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值