【merge】openGauss、PostgreSQL、Oracle的merge写法

121 篇文章 17 订阅
33 篇文章 1 订阅

【merge】openGauss、PostgreSQL、Oracle的merge写法


测试表

/* 测试表 tzq_log_t */
CREATE TABLE tzq.tzq_log_t (
  log_id int8 not null default nextval('tzq_log_s'),
  log_type varchar(100),
  log_title varchar(100),
  log_content text,
  last_update_date timestamp(6) not null default CURRENT_TIMESTAMP,
  CONSTRAINT tzq_log_t_pkey PRIMARY KEY (log_id)
);
/* 测试接口表 tzq_log_ti */
CREATE TABLE tzq.tzq_log_ti (
  log_id int8 not null,
  log_type varchar(100),
  log_title varchar(100),
  log_content text,
  last_update_date timestamp(6),
  process_status int8,
  process_date timestamp(6)
);

一、openGauss

/* openGauss 的 merge */
DO $$ 
DECLARE
  cur_interface record;
  v_isok BOOLEAN;
BEGIN
  FOR cur_interface IN (SELECT ctid AS row_id
                              ,log_id
                              ,log_type
                              ,log_title
                              ,log_content
                              ,last_update_date
                          FROM tzq.tzq_log_ti
                         WHERE process_status = 2
                         ORDER BY log_id ASC) LOOP
    BEGIN
      v_isok:= true;
      MERGE INTO tzq.tzq_log_t a
      USING (SELECT cur_interface.log_id
                   ,cur_interface.log_type
                   ,cur_interface.log_title
                   ,cur_interface.log_content
                   ,cur_interface.last_update_date) b
      ON (a.log_id = b.log_id)
      WHEN MATCHED THEN
        UPDATE
           SET log_type         = b.log_type
              ,log_title        = b.log_title
              ,log_content      = b.log_content
              ,last_update_date = b.last_update_date
      WHEN NOT MATCHED THEN
        INSERT
          (a.log_id
          ,a.log_type
          ,a.log_title
          ,a.log_content
          ,a.last_update_date)
        VALUES
          (b.log_id
          ,b.log_type
          ,b.log_title
          ,b.log_content
          ,b.last_update_date);
    END;
    IF (v_isok) THEN
      UPDATE tzq.tzq_log_ti ti
         SET process_status   = 4
       WHERE ti.ctid = cur_interface.row_id;
      COMMIT;
    END IF;
  END LOOP;
END $$;

二、PostgreSQL

/* PostgreSQL 的 merge */
DO $$ 
DECLARE
  cur_interface record;
  v_isok BOOLEAN;
BEGIN
  FOR cur_interface IN (SELECT ctid AS row_id
                              ,log_id
                              ,log_type
                              ,log_title
                              ,log_content
                              ,last_update_date
                          FROM tzq.tzq_log_ti
                         WHERE process_status = 2
                         ORDER BY log_id ASC) LOOP
    BEGIN
      v_isok:= true;
      INSERT INTO tzq.tzq_log_t
            (log_id
            ,log_type
            ,log_title
            ,log_content
            ,last_update_date)
      SELECT cur_interface.log_id
            ,cur_interface.log_type
            ,cur_interface.log_title
            ,cur_interface.log_content
            ,cur_interface.last_update_date
          ON CONFLICT ON CONSTRAINT tzq_log_t_pkey DO UPDATE
         SET log_type         = EXCLUDED.log_type
            ,log_title        = EXCLUDED.log_title
            ,log_content      = EXCLUDED.log_content
            ,last_update_date = EXCLUDED.last_update_date;
    END;
    IF (v_isok) THEN
      UPDATE tzq.tzq_log_ti ti
         SET process_status   = 4
       WHERE ti.ctid = cur_interface.row_id;
      COMMIT;
    END IF;
  END LOOP;
END $$;

三、Oracle

/* Oracle 的 merge */
MERGE INTO tzq.tzq_log_t a
USING (SELECT cur_interface.log_id
             ,cur_interface.log_type
             ,cur_interface.log_title
             ,cur_interface.log_content
             ,cur_interface.last_update_date) b
ON (a.log_id = b.log_id)
WHEN MATCHED THEN
  UPDATE
     SET log_type         = b.log_type
        ,log_title        = b.log_title
        ,log_content      = b.log_content
        ,last_update_date = b.last_update_date
WHEN NOT MATCHED THEN
  INSERT
    (a.log_id
    ,a.log_type
    ,a.log_title
    ,a.log_content
    ,a.last_update_date)
  VALUES
    (b.log_id
    ,b.log_type
    ,b.log_title
    ,b.log_content
    ,b.last_update_date);
COMMIT;
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tzq@2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值