Mybatis 批量插入 exception:ORA-00933: SQL 命令未正确结束
Mybatis batch insert exception:ORA-00933: SQL command not properly ended
我的项目使用了Springboot和Mybatis,我使用批量插入语法来保存数据
我使用了 oracle 数据库
<sql id="site_columns">
ID, SITE_URL, BRM_HGSSITE_ID, BRM_SITE_STATUS, BPS_HGSSITE_ID, SITE_STATUS, OP_HGSSITE_ID, BILLING_PLATFORM, BLIS_EFFECTIVE_FROM,
BLIS_EFFECTIVE_TO, BRM_EFFECTIVE_FROM, ISSUE_TYPE, COMMENTS, CSM_FIRST_NAME, CSM_LAST_NAME, CSM_EMAIL, CREATE_TIME
</sql>
<insert id="batchSaveVerifiedSitesFromFile" parameterType="siteSummaryInfoBean">
INSERT INTO MR_VERIFIED_SITE_LIST(<include refid="site_columns"/>) VALUES
<foreach collection="list" item="site" separator=",">
(MR_VERIFIED_SITE_LIST_SEQ.nextval, #{site.webexurl}, #{site.brm_hgssiteid}, #{site.brm_sitestatus},
#{site.bps_hgssiteid}, #{site.sitestatus},
#{site.op_hgssiteid}, #{site.billingplatform,jdbcType=VARCHAR}, #{site.blis_effectiveFrom,jdbcType=DATE},
#{site.blis_effectiveTo,jdbcType=DATE}, #{site.brm_effectiveFrom,jdbcType=DATE},
#{site.issueType,jdbcType=VARCHAR}, #{site.comments,jdbcType=VARCHAR},
#{site.csmfirstname,jdbcType=VARCHAR}, #{site.csmlastname,jdbcType=VARCHAR},
#{site.csmemail,jdbcType=VARCHAR},
greatest(nvl(#{site.blis_effectiveTo,jdbcType=DATE},sysdate),
nvl(#{site.brm_effectiveFrom,jdbcType=DATE},sysdate)))
</foreach>
</insert>
插入语句应该在foreach里面。
例如,在代码本身的每个循环中覆盖 $sql 变量。
Oracle 不支持多行插入语句。
你可以写一个insert into ... select ... union all select ...
语句as seen in a different answer。
这样,在您的 foreach
循环中,分隔符将为 union all
,循环体将为 select ... from dual
。
我的项目使用了Springboot和Mybatis,我使用批量插入语法来保存数据 我使用了 oracle 数据库
<sql id="site_columns">
ID, SITE_URL, BRM_HGSSITE_ID, BRM_SITE_STATUS, BPS_HGSSITE_ID, SITE_STATUS, OP_HGSSITE_ID, BILLING_PLATFORM, BLIS_EFFECTIVE_FROM,
BLIS_EFFECTIVE_TO, BRM_EFFECTIVE_FROM, ISSUE_TYPE, COMMENTS, CSM_FIRST_NAME, CSM_LAST_NAME, CSM_EMAIL, CREATE_TIME
</sql>
<insert id="batchSaveVerifiedSitesFromFile" parameterType="siteSummaryInfoBean">
INSERT INTO MR_VERIFIED_SITE_LIST(<include refid="site_columns"/>) VALUES
<foreach collection="list" item="site" separator=",">
(MR_VERIFIED_SITE_LIST_SEQ.nextval, #{site.webexurl}, #{site.brm_hgssiteid}, #{site.brm_sitestatus},
#{site.bps_hgssiteid}, #{site.sitestatus},
#{site.op_hgssiteid}, #{site.billingplatform,jdbcType=VARCHAR}, #{site.blis_effectiveFrom,jdbcType=DATE},
#{site.blis_effectiveTo,jdbcType=DATE}, #{site.brm_effectiveFrom,jdbcType=DATE},
#{site.issueType,jdbcType=VARCHAR}, #{site.comments,jdbcType=VARCHAR},
#{site.csmfirstname,jdbcType=VARCHAR}, #{site.csmlastname,jdbcType=VARCHAR},
#{site.csmemail,jdbcType=VARCHAR},
greatest(nvl(#{site.blis_effectiveTo,jdbcType=DATE},sysdate),
nvl(#{site.brm_effectiveFrom,jdbcType=DATE},sysdate)))
</foreach>
</insert>
插入语句应该在foreach里面。
例如,在代码本身的每个循环中覆盖 $sql 变量。
Oracle 不支持多行插入语句。
你可以写一个insert into ... select ... union all select ...
语句as seen in a different answer。
这样,在您的 foreach
循环中,分隔符将为 union all
,循环体将为 select ... from dual
。