刚开始用游标,后来听取同事的建议采用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`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...
Mybatis批量foreach merge into的用法 Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不...
标题:Oracle Merge Into 的使用 描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为...
在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...
让我们详细了解一下`MERGE INTO`的语法和几个基本用法。 `MERGE INTO`的基本语法如下: ```sql MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...) WHEN ...
Oracle 数据库中 Merge Into 的用法 在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则...
非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者
熟练掌握`MERGE INTO`的用法,能够有效地提升数据处理的效率和准确性。通过实例,我们可以看到它如何根据不同的匹配情况灵活地执行更新和插入操作,以保持目标表的最新状态。在实际工作中,我们需要根据具体需求调整...
本文将详细解释`MERGE`语句的用法,并通过实例进行说明。 1. **基本结构** `MERGE INTO`语句的基本结构如下: ```sql MERGE INTO 目标表 USING (源查询) 源 ON (匹配条件) WHEN MATCHED THEN UPDATE SET 列 = ...
### Oracle Merge 用法详解 #### 一、Oracle Merge 命令介绍 自Oracle 9i版本开始,Oracle数据库引入了一个非常强大的SQL语句——`MERGE`命令。通过这个命令,用户可以在一个单一的SQL语句中完成对表的插入(`...
### Merge的用法详解 在数据库操作中,`MERGE`语句是一种非常强大的工具,它结合了`UPDATE`和`INSERT`的功能,允许我们根据源表中的数据更新目标表中的记录,如果源表中的记录在目标表中不存在,则可以插入新记录。...
INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA) 更新多个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE ...
主要类是pybigquery_merge_into.merge_clause.MergeInto() 。 例子 >> > query = MergeInto ( target = target , source = source , onclause = target . c . t1 == source . c . s1 , when_clauses = [ ...
`Merge`函数是SQL Server 2008引入的一个强大的数据操纵语言(DML)关键字,它可以合并`Insert`、`Update`和`Delete`操作到一个单一的语句中,极大地提高了数据库维护的效率和代码的简洁性。在本文中,我们将深入...
`MERGE INTO table_name [alias]`用于指定目标表,`USING table_or_query [alias]`则指定了源数据,这里的`table_or_query`可以是另一个表或一个SQL查询结果。`ON (condition)`定义了匹配条件,即何时将源表的记录与...
如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 ...
Hibernate merge 使用详情解说 在 Hibernate 中,merge 方法是非常重要的一个方法,它能够帮助开发者轻松地处理数据的更新和插入操作。那么,merge 方法到底如何工作的呢?下面,我们将对 merge 方法进行详细的解释...