`
mai511960247
  • 浏览: 4712 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

merge into用法

阅读更多
刚开始用游标,后来听取同事的建议采用merge into,效率上确实提升一大截,这个方法是从oracle10开始引入的。
create or replace procedure P_CRM_TF_SM_3GEND(--必须传1个参数,不然GTM报错
                                              in_channel IN VARCHAR2,
                                              v_resultcode    OUT NUMBER,
                                              v_resulterrinfo OUT VARCHAR2) IS
                                             
     --3G到期用户数据提取                                             
     v_begin_time        DATE := sysdate-1/24;
     v_end_time          DATE := sysdate;     
     --v_begin_time        DATE := to_date('2012-05-11 00:10:00','yyyy-mm-dd hh24:mi:ss');
     --v_end_time          DATE := to_date('2012-05-11 14:10:00','yyyy-mm-dd hh24:mi:ss'); 
/*     --取前两小时所有用户数据
     CURSOR c1 is
     SELECT EPARCHY_CODE,SERIAL_NUMBER,IS_REGISTER,IS_ORDER,REGISTER_TIME,ORDER_TIME,CREATE_TIME,CANCEL_TIME,REMARK FROM uop_uif1.TF_SM_3GEND_DZQD_JK@DBLNK_UIF1 t
      WHERE t.CREATE_TIME BETWEEN v_begin_time AND  v_end_time ;
      t_c1  c1%rowtype;
      v_num             NUMBER;
begin
     v_resultcode    := 0;
     v_resulterrinfo := '存储过程执行成功';
     if c1%isopen = false then
        open c1;   
     end if;
      loop
        FETCH c1 INTO t_c1;
        exit when c1%notfound;
        if (c1%found) then
          --统计该用户是否存在记录
          select count(1) into v_num from TF_SM_3GEND_DZQD_JK t where t.SERIAL_NUMBER = t_c1.serial_number;
          if (v_num > 0 ) then
            --如果用户已有数据,取用户最新的一条记录更新
            update TF_SM_3GEND_DZQD_JK set EPARCHY_CODE=t_c1.Eparchy_Code,IS_REGISTER=t_c1.Is_Register,IS_ORDER=t_c1.Is_Order,REGISTER_TIME=t_c1.Register_Time,ORDER_TIME=t_c1.Order_Time,CREATE_TIME=t_c1.Create_Time,CANCEL_TIME=t_c1.Cancel_Time,REMARK=t_c1.REMARK 
             where SERIAL_NUMBER = t_c1.serial_number and CREATE_TIME<t_c1.create_time;
             commit;
          ELSIF v_num = 0 THEN
           --如果没有用户记录,则插入该用户数据
            insert into TF_SM_3GEND_DZQD_JK (EPARCHY_CODE,SERIAL_NUMBER,IS_REGISTER,IS_ORDER,REGISTER_TIME,ORDER_TIME,CREATE_TIME,CANCEL_TIME,REMARK)
            values(t_c1.eparchy_code,t_c1.serial_number,t_c1.is_register,t_c1.is_order,t_c1.register_time,t_c1.order_time,t_c1.create_time,t_c1.cancel_time,t_c1.REMARK);
            commit;
          end if;
        end if;
      end loop;
     if c1%isopen then
     Close c1;
     end if;
     commit;*/
     --采用merge into 提升效率
begin
      v_resultcode    := 0;
      v_resulterrinfo := '存储过程执行成功';
      MERGE INTO TF_SM_3GEND_DZQD_JK t   
      USING (select * from uop_uif1.TF_SM_3GEND_DZQD_JK@DBLNK_UIF1 tt where  tt.create_time =
            (SELECT max(oo.create_time) FROM uop_uif1.TF_SM_3GEND_DZQD_JK@DBLNK_UIF1 oo
            WHERE oo.serial_number=tt.serial_number
            and oo.create_time BETWEEN v_begin_time AND  v_end_time group by oo.serial_number)) ot   
        ON (t.SERIAL_NUMBER = ot.SERIAL_NUMBER)
        WHEN MATCHED THEN  
        UPDATE  
         SET t.EPARCHY_CODE=ot.Eparchy_Code,
         t.IS_REGISTER=ot.Is_Register,
         t.IS_ORDER=ot.Is_Order,
         t.REGISTER_TIME=ot.Register_Time,
         t.ORDER_TIME=ot.Order_Time,
         t.CREATE_TIME=ot.Create_Time,
         t.CANCEL_TIME=ot.Cancel_Time,
         t.REMARK=ot.REMARK   
        WHERE t.CREATE_TIME < ot.create_time
        and ot.SERIAL_NUMBER in (select SERIAL_NUMBER from Tf_Sm_3gend_Dzqd_Jk)
        WHEN NOT MATCHED THEN  
         INSERT  
         VALUES (ot.serial_number,ot.is_register,ot.is_order,ot.register_time,
         ot.order_time,ot.cancel_time,ot.create_time,ot.REMARK,ot.eparchy_code)
         WHERE ot.serial_number not in (select SERIAL_NUMBER from Tf_Sm_3gend_Dzqd_Jk );
         commit;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        v_resultcode    := -1;
        v_resulterrinfo := '运行过程中出错' || SQLERRM;
        RETURN;
end P_CRM_TF_SM_3GEND;
分享到:
评论

相关推荐

    Oracle merge into用法

    在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法 Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不...

    oracle merge into的使用

    标题:Oracle Merge Into 的使用 描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为...

    Oracle中merge into的使用

    在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...

    oracle中merge into用法及实例解析

    让我们详细了解一下`MERGE INTO`的语法和几个基本用法。 `MERGE INTO`的基本语法如下: ```sql MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...) WHEN ...

    浅谈Oracle数据库中Merge Into的用法.pdf

    Oracle 数据库中 Merge Into 的用法 在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则...

    Merge Into 语句代替InsertUpdate

    非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者

    Merge into的使用详解

    熟练掌握`MERGE INTO`的用法,能够有效地提升数据处理的效率和准确性。通过实例,我们可以看到它如何根据不同的匹配情况灵活地执行更新和插入操作,以保持目标表的最新状态。在实际工作中,我们需要根据具体需求调整...

    merge用法详解(实例详解)

    本文将详细解释`MERGE`语句的用法,并通过实例进行说明。 1. **基本结构** `MERGE INTO`语句的基本结构如下: ```sql MERGE INTO 目标表 USING (源查询) 源 ON (匹配条件) WHEN MATCHED THEN UPDATE SET 列 = ...

    oracle merge 用法详解

    ### Oracle Merge 用法详解 #### 一、Oracle Merge 命令介绍 自Oracle 9i版本开始,Oracle数据库引入了一个非常强大的SQL语句——`MERGE`命令。通过这个命令,用户可以在一个单一的SQL语句中完成对表的插入(`...

    merge的用法

    ### Merge的用法详解 在数据库操作中,`MERGE`语句是一种非常强大的工具,它结合了`UPDATE`和`INSERT`的功能,允许我们根据源表中的数据更新目标表中的记录,如果源表中的记录在目标表中不存在,则可以插入新记录。...

    MySQL中实现插入或更新操作(类似Oracle的merge语句)

    INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB&gt;0,1,columnA) 更新多个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE ...

    pybigquery-merge-into:向pybigquery添加MERGE INTO支持

    主要类是pybigquery_merge_into.merge_clause.MergeInto() 。 例子 &gt;&gt; &gt; query = MergeInto ( target = target , source = source , onclause = target . c . t1 == source . c . s1 , when_clauses = [ ...

    SQLServer中merge函数用法详解

    `Merge`函数是SQL Server 2008引入的一个强大的数据操纵语言(DML)关键字,它可以合并`Insert`、`Update`和`Delete`操作到一个单一的语句中,极大地提高了数据库维护的效率和代码的简洁性。在本文中,我们将深入...

    merge用法详解

    `MERGE INTO table_name [alias]`用于指定目标表,`USING table_or_query [alias]`则指定了源数据,这里的`table_or_query`可以是另一个表或一个SQL查询结果。`ON (condition)`定义了匹配条件,即何时将源表的记录与...

    Oracle MERGE INTO的用法示例介绍

    如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 ...

    Hibernate中的merge使用详情解说

    Hibernate merge 使用详情解说 在 Hibernate 中,merge 方法是非常重要的一个方法,它能够帮助开发者轻松地处理数据的更新和插入操作。那么,merge 方法到底如何工作的呢?下面,我们将对 merge 方法进行详细的解释...

Global site tag (gtag.js) - Google Analytics