Oracle,PostgreSQL存在即更新,不存在则插入Sql

PostgreSQL: INSERT INTO ... ON conflict(,) DO UPDATE SET ...(conflict里面的字段必须建唯一索引或联合唯一索引)

@Insert("<script>" +
            "   INSERT INTO CSP_PHASE_CODE_HISTORY(ACCOUNT_ID,PHASE_CODE,END_TIME,DESCRIPTION" +
            "   ,BANK_CODE)" +
            "   VALUES(#{accountId},#{phaseCode},#{startTime},#{endTime},#{description}," +
            "   #{bankCode})" +
            "   ON conflict(APPLY_NO,PHASE_CODE)" +
            "   DO UPDATE SET " +
            "  <if test=\"phaseCodeEndTime != null\">" +
            "        END_TIME = #{endTime}," +
            "   </if>" +
            "  <if test=\"phaseCodeStartTime != null\">" +
            "       START_TIME = #{startTime}," +
            "   </if>" +
            "  <if test=\"accountId != null\">" +
            "        ACCOUNT_ID = #{accountId}," +
            "   </if>" +
            "  <if test=\"bankCode != null\">" +
            "        BANK_CODE = #{bankCode}," +
            "   </if>" +
            "  <if test=\"phaseCodeDescription != null\">" +
            "       DESCRIPTION = #{description}," +
            "   </if>" +
            "  date_updated = now() " +
            "</script>" )
    void insertPhaseCodeHistory(Map<String,Object> map);

Oracle:使用存储过程:

写法一:

 @InsertProvider(type = BreakPointRecordMapperSql.class,method = "insertBreakPointRecordIfNotUpdate")
    public void insertBreakPointRecordIfNotUpdate(TieCardNodeDTO bean);


    public class BreakPointRecordMapperSql {

        public String insertBreakPointRecordIfNotUpdate(TieCardNodeDTO bean) {
                StringBuilder sb = new StringBuilder();
                sb.append("BEGIN ").append("\n");
                sb.append(updateBreakPointRecord(bean)).append(";").append("\n");
                sb.append("IF SQL%NOTFOUND THEN ").append("\n");
                sb.append(insertBreakPointRecord(bean)).append(";").append("\n");
                sb.append("END IF;").append("\n");
                sb.append("END;").append("\n");
                return sb.toString();
        }

        public String insertBreakPointRecord(TieCardNodeDTO bean) {
            return new SQL() {{
                INSERT_INTO("CSP_BREAKPOINT_RECORD");
                if(StringUtils.isNotBlank(bean.getAccountId()))     {   VALUES("ACCOUNT_ID", "#{accountId,jdbcType=VARCHAR}");}
                if(StringUtils.isNotBlank(bean.getToken()))         {   VALUES("TOKEN", "#{token,jdbcType=VARCHAR}");}
                if(StringUtils.isNotBlank(bean.getCurrentNode()))   {   VALUES("CURRENT_NODE", "#{currentNode,jdbcType=VARCHAR}");}
                if(StringUtils.isNotBlank(bean.getParamStr()))      {   VALUES("PARAM_STR", "#{paramStr,jdbcType=VARCHAR}");}
                if(StringUtils.isNotBlank(bean.getCreatedBy()))     {   VALUES("CREATED_BY", "#{createdBy,jdbcType=VARCHAR}");}
                if(StringUtils.isNotBlank(bean.getDateCreated()))   {   VALUES("DATE_CREATED", "#{createdDate,jdbcType=DATE}");}
                if(StringUtils.isNotBlank(bean.getUpdatedBy()))     {   VALUES("UPDATED_BY", "#{updatedBy,jdbcType=VARCHAR}");}
                if(StringUtils.isNotBlank(bean.getDateUpdated()))   {   VALUES("DATE_UPDATED", "#{updatedDate,jdbcType=DATE}");}
            }}.toString();
        }

        public String updateBreakPointRecord(TieCardNodeDTO bean) {
            return new SQL() {{
                UPDATE("CSP_BREAKPOINT_RECORD");
                SET("TOKEN = #{token,jdbcType=VARCHAR}");
                SET("CURRENT_NODE = #{currentNode,jdbcType=VARCHAR}");
                SET("PARAM_STR = #{paramStr,jdbcType=VARCHAR}");
                WHERE("ACCOUNT_ID = #{accountId}");
            }}.toString();
        }
    }

写法二:

@Update("<script>" +
            " declare" +
            " begin" +
            " update code_map set attribute1 = #{attribute1}" +
            " where code_id = #{codeId} ;" +
            " if sql%notfound then" +
            " insert into code_map(code_id,attribute1) values(#{codeId},#{attribute1});" +
            " end if;" +
            " end;" +
            "</script>")
public void updateData(Map map);

注意语法细节,不要漏了分号;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值