Oracle:Merge Into 实例

基础语法:
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN [execute something else here ! ] 
实例:
insert into TPT_PC_PRICE(tpt_nbr,tpt_user,tpt_vend,tpt_sort,tpt_part,tpt_desc1,tpt_price_old,tpt_price,tpt_curr, tpt_start,tpt_ct_desc,tpt_vat,tpt_um,tpt_um_rate,tpt_char1,
    tpt_char2 ,tpt_char3,tpt_char4,tpt_char5,tpt_char6,tpt_qty1,tpt_qty2,tpt_pst,tpt_rmks,tpt_w_price,TPT_TYPE,Tpt_Rate)
    select pc_nbr, var_usr_user,pc_vend, vd_sort, pc_part, pt_desc1, 0.00 as price_old,pc_price,pc_curr, pc_start, ct_desc, pc_vat, pc_um,PC_UM_RATE_M e,pc_char1,
          pc_char2, pc_char3, pc_char4,pc_char5,pc_char6,pc_w_price, pc_qty2,pc_pst,pc_rmks,pc_w_price,pc_type,PC_CUSTOM_VAT
    from pc_mstr join vd_mstr on pc_vend = vd_addr
                 join pt_mstr on pc_part = pt_part
                 join ct_mstr on vd_cr_terms = ct_code
    where -- (((pc_vend >=  var_vend_fr) or (var_vend_fr is null))  and ((pc_vend <=var_vend_to) OR (var_vend_to is null)))  and
          --(((pc_part >=  var_part_fr) or (var_part_fr is null))  and ((pc_part <=var_part_to) OR (var_part_to is null)))
         func_vd_perm(vd_exploiter, var_usr_user) = 1
        and between2(vd_exploiter, var_dev1, var_dev2)=1
        and between2(pc_vend, var_vend_fr, var_vend_to) =1
       and between2(pc_part, var_part_fr ,var_part_to) = 1
       and pc_start>= var_data1 and pc_start <= var_data2
        --  AND trunc(sysdate, ‘DD‘) between pc_start and pc_expire
   and pc_pst = 0;

    MERGE INTO TPT_PC_PRICE A
            USING (select B.pc_vend,B.pc_part,B.pc_price,B.pc_type
                   from  pc_mstr B join
                      (select pc_vend,pc_part,max(pc_expire) as pc_expire_old,pc_type
                          from pc_mstr join TPT_PC_PRICE on  tpt_vend =pc_vend and tpt_part = pc_part
                                       where pc_pst = 1
                                       group by pc_vend, pc_part,pc_type
                       )H on B.pc_vend = H.pc_vend and B.pc_part = H.pc_part and H.pc_expire_old =B.pc_expire and H.pc_type=B.pc_type 

         ) T  on (pc_vend = tpt_vend and pc_part = tpt_part and pc_type=tpt_type)
            WHEN MATCHED THEN
                UPDATE SET tpt_price_old = T.pc_price
                where tpt_user = var_usr_user and
                     --(((tpt_vend >=  var_vend_fr) or (var_vend_fr is null))  and ((tpt_vend <=var_vend_to) OR (var_vend_to is null)))  and
                      -- (((tpt_part >=  var_part_fr) or (var_part_fr is null))  and ((tpt_part <=var_part_to) OR (var_part_to is null)));
                     between2(tpt_vend, var_vend_fr, var_vend_to) = 1  and
                     between2(tpt_part, var_part_fr ,var_part_to) = 1 ;
异常处理:

跟踪结果:

原因分析:(注:版本:Oracle 9i)

根据异常描述可以判断是数据匹配上的问题,且问题大致是数据出现一对多的关系,导致异常。

现附上异常数据寻找思路:

SELECT pc_vend,pc_part,pc_type FROM (
-------------------------------------主表数据------------------------------------------------------------
select pc_vend,pc_part,pc_type from (
select pc_nbr, ‘KXX003‘,pc_vend, vd_sort, pc_part, pt_desc1, 0.00 as price_old,pc_price,pc_curr, pc_start, ct_desc, pc_vat, pc_um,PC_UM_RATE_M e,pc_char1,
          pc_char2, pc_char3, pc_char4,pc_char5,pc_char6,pc_w_price, pc_qty2,pc_pst,pc_rmks,pc_w_price,pc_type,PC_CUSTOM_VAT
    from pc_mstr join vd_mstr on pc_vend = vd_addr
                 join pt_mstr on pc_part = pt_part
                 join ct_mstr on vd_cr_terms = ct_code
    where
         func_vd_perm(vd_exploiter, ‘KXX003‘) = 1
        and between2(vd_exploiter, ‘PQ002‘, ‘PQ002‘)=1
        and between2(pc_vend, ‘7B11R1001‘, ‘7B11R1001‘) =1
       and between2(pc_part, ‘‘ ,‘ZZZZZZZZZZZZ‘) = 1
       and pc_start>= to_date(‘2017-09-01‘,‘yyyy-mm-dd‘) and pc_start <= to_date(‘2017-09-06‘,‘yyyy-mm-dd‘)
        --  AND trunc(sysdate, ‘DD‘) between pc_start and pc_expire
   and pc_pst = 0
   )
-------------------------------------主表数据 end------------------------------------------------------------
UNION ALL
-----------------------------------匹配表数据--------------------------------------------------------------------
   select B.pc_vend,B.pc_part,B.pc_type
                   from  pc_mstr B join
                      (select C.pc_vend,C.pc_part,max(C.pc_expire) as pc_expire_old,C.pc_type
                          from pc_mstr C join
                          (select pc_vend tpt_vend,pc_part tpt_part,pc_type tpt_type from (
select pc_nbr, ‘KXX003‘,pc_vend, vd_sort, pc_part, pt_desc1, 0.00 as price_old,pc_price,pc_curr, pc_start, ct_desc, pc_vat, pc_um,PC_UM_RATE_M e,pc_char1,
          pc_char2, pc_char3, pc_char4,pc_char5,pc_char6,pc_w_price, pc_qty2,pc_pst,pc_rmks,pc_w_price,pc_type,PC_CUSTOM_VAT
    from pc_mstr join vd_mstr on pc_vend = vd_addr
                 join pt_mstr on pc_part = pt_part
                 join ct_mstr on vd_cr_terms = ct_code
    where
         func_vd_perm(vd_exploiter, ‘KXX003‘) = 1
        and between2(vd_exploiter, ‘PQ002‘, ‘PQ002‘)=1
        and between2(pc_vend, ‘7B11R1001‘, ‘7B11R1001‘) =1
       and between2(pc_part, ‘‘ ,‘ZZZZZZZZZZZZ‘) = 1
       and pc_start>= to_date(‘2017-09-01‘,‘yyyy-mm-dd‘) and pc_start <= to_date(‘2017-09-06‘,‘yyyy-mm-dd‘)
        --  AND trunc(sysdate, ‘DD‘) between pc_start and pc_expire
   and pc_pst = 0
   ))

                          on  tpt_vend =pc_vend and tpt_part = pc_part
                                       where pc_pst = 1
                                       group by C.pc_vend, C.pc_part,C.pc_type
                       )H on B.pc_vend = H.pc_vend and B.pc_part = H.pc_part and H.pc_expire_old =B.pc_expire and H.pc_type=B.pc_type
-----------------------------------匹配表数据 end--------------------------------------------------------------------
)
GROUP BY pc_vend,pc_part,pc_type
HAVING COUNT(1) > 2

时间: 2024-10-07 07:02:57

Oracle:Merge Into 实例的相关文章

Oracle Merge into [转] [ http://www.cnblogs.com/dongsheng/p/4384754.html]

Oracle中Merge into用法总结 起因: 前段时间,因为涉及到一张表的大数据操作,要同时进行增删改,我跟师傅想了很多优化办法,结果都不尽人意.刚开始用的就是原始算法,先更新现有记录,再插入满足要求的其他记录,最后再删除多余记录,但是少量数据还可以,10W条数据就不行了,前台的超时时间是60s,远远无法满足要求.之后又想办法将任务进行拆分,根据每条记录流水号尾字符不同进行拆分,用多个线程同时执行,一直拆分成10个任务(尾字符分别为0.1.2.3 ... 9),用十个线程同时去执行,但是时

Linux平台oracle 11g单实例 安装部署配置 快速参考

1.重建主机的Oracle用户 组 统一规范 uid gid 以保证共享存储挂接或其他需求的权限规范 userdel -r oracle groupadd -g 500 oinstall groupadd -g 501 dba useradd -g oinstall -G dba -u 500 oracle #id oracle uid=500(oracle) gid=500(oinstall) 组=500(oinstall),501(dba) 2.安装好Oracle 需要的rpm包.安装rpm

【转】Oracle - 数据库的实例、表空间、用户、表之间关系

[转]Oracle - 数据库的实例.表空间.用户.表之间关系 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘

Oracle MERGE INTO的用法

很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作 - 避免了分开更新 - 提高性能并易于使用

Oracle - 数据库的实例、表空间、用户、表之间关系

完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件.Oracle有一个很大的内存快,成为全局区(SGA

oracle事务处理及实例演示jdbc操作批量删除

事务 作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条sql语句来构成.当然还有针对非数据库操作的,如在计算机中设置的还原点即是一个很好的应用. 对于事务的基本性质在另一篇中有所叙述:SQL 事务及实例演示 oracle和sql server在事务上区别 sql server中的事务一般分为隐式事务.显式事务.自动提交事务. 自动事务:对于sql server来说,当客户端提交一条sql语句时,这时候sql server都会自动启动一个事务:对于这样的事务,在执行完sql语句后会自动提交

[Oracle] Merge语句

Merge的语法如下: MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] { table | view | subquery } [t_alias] ON ( condition ) WHEN MATCHED THEN merge_update_clause WHEN NOT MATCHED THEN merge_insert_clause; MERGE是什么,如何使用呢?让我们先看一个简单的需求: 需求是,从T1表更新数

oracle merge用法

动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert). 实战: 接下来我们有一个任务,有一个表T,有两个字段a,b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录.在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL S

Oracle merge

oracle merge 語法: 用途: Use the MERGE statement to select rows from one or more sources for update orinsertion into a table or view. You can specify conditions to determine whether toupdate or insert into the target table or view. It lets you avoid mult

搭建Oracle 11G单实例Active DataGuard

Oracle 11G单实例ActiveDataGuard 1.基础环境准备 1.1基础环境说明: 操作系统:RHEL 5.5 64bit 数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit 1.2数据库服务名称及目录说明: 主库 备库 IP地址 192.168.4.157 192.168.4.158 主机名称 primary01 standby01 db_name testdb testdb db_uni