一、MERGE INTO语句

  1、merge into语句的功能:我们操作数据库的时候,有时候会遇到insert或者Update这种需求。我们操纵代码时至少需要写一个插入语句和更新语句并且还得单独写方法效验数据是否存在,这种操作完全可以用merge into语句代替,不仅省时省力而且条理更清晰,一个SQL语句直接完成插入,如果有相同主键进行更新操作。

使用场景:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表或者更多的操作。

  2、具体SQL:下边sql是我在工作中最常使用的,功能是对接口表(表B)中通过批次ID查到的合同进行对正式表(表A)插入和更新。除此之外,还可以根据你的想实现功能进行各种条件更新和插入。只update或者只insert,带条件的update或带条件的insert,全插入insert实现,带delete的update(觉得可以用3来实现)

MERGE INTO后是更新的表,USING是对接口表进行筛选,(如果有重复数据,仅选取一行插入,用ORDER BY 控制)。ON中是具体的条件(表中标识字段,字段编码)满足执行 WHEN MATCHED THEN 下的语句
不满足则执行WHEN NOT MATCHED THEN 后语句:
MERGE INTO TableA A 
USING (
(SELECT L.*,
ROW_NUMBER() OVER(PARTITION BY T.FLEX_VALUE ORDER BY 1) AS RN
FROM TABLEB L
WHERE T.BATCH_ID = #{batchId} ) L
AND L.RN = 1 ) B
ON ( A.FLEX_VALUE = B.FLEX_VALUE )
WHEN MATCHED THEN
UPDATE
A.FLEX_VALUE_SET_NAME = B.FLEX_VALUE_SET_NAME,
A.VALIDATION_TYPE = B.VALIDATION_TYPE,
WHEN NOT MATCHED THEN
INSERT (
A.FLEX_VALUE_SET_NAME = B.FLEX_VALUE_SET_NAME,
A.VALIDATION_TYPE = B.VALIDATION_TYPE)

二、ORACLE的存储过程

  1、定义:存储过程(Stored Procedure):就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过,编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数,来调用并执行它,从而完成一个或一系列的数据库操作。

  2、创建:Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

我在工作中常用的一个存储过程结构如下:

--存储过程校验信息,三个入参,一个输入批次。输出分别是错误编码,和错误信息。

  PROCEDURE VALIDATE_ARCHIVE_ITF(P_BATCHID IN VARCHAR2,
                    P_FLAG OUT NUMBER,
                    P_MSG OUT VARCHAR2) IS
         CURSOR CMS_ARCHIVE_ITF(BATCHID VARCHAR2) IS
      SELECT ROWID,
        CONTRACT_NO,
        ARCHIVE_STUTAS,
        ERROR_INFO,
        ARC_TIME
      FROM CMS_ARCHIVE_IFT CAI
      WHERE CAI.BATCH_ID = BATCHID;
  L_ERROR_MSG VARCHAR2(255); --定义变量错误信息
  L_TENANT_ID VARCHAR2(255);--定义变量租户ID
  L_CONTRACT_SERIAL_NO VARCHAR2(255);--定义变量
BEGIN
    FOR RET IN CMS_ARCHIVE_ITF(P_BATCHID) LOOP
    L_ERROR_MSG := NULL;--给传入三个参数赋默认值
    P_FLAG := 1;
    P_MSG := NULL;

  --对输入字段非空效验  
  IF (RET.ARC_TIME IS NULL OR RET.ARC_TIME = '') THEN
    L_ERROR_MSG := L_ERROR_MSG || 'LAST_UPDATE_DATE不能为空;';
  END IF;
  --判断非空校验是否成功,不成功继续继续下一个。如果有错误更新接口表
  IF L_ERROR_MSG IS NOT NULL THEN
  P_FLAG := -99;
  UPDATE CMS_ARCHIVE_IFT
  SET ERROR_CODE = '01', ERROR_MSG = L_ERROR_MSG
  WHERE ROWID = RET.ROWID;
  CONTINUE;
  END IF;
  --如果成功通过条件效验
  IF P_FLAG = 1 THEN
  BEGIN
  INSERT INTO CMS_ARCHIVE_INFO
    (TENANT_ID,
    CONTRACT_ID,
    ARCHIVE_ID)
    VALUES
      ( RET.TENANT_ID,
       (SELECT CONTRACT_ID
        FROM CMS_CONTRACT_INFO
        WHERE CONTRACT_NO = RET.CONTRACT_NO),
        SYS_GUID() )

      EXCEPTION--异常信息
      WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM, 1, 200));
      P_FLAG := -99;
      P_MSG := SUBSTR(SQLERRM, 1, 200);
      END;
      END IF;
      END LOOP;
      END;

  

2.5 Oracle之存储过程和MERGE INTO语句的更多相关文章

  1. oracle数据库存储过程中的select语句的位置

    导读:在oracle数据库存储过程中如果用了select语句,要么使用"select into 变量"语句要么使用游标,oracle不支持单独的select语句. 先看下这个存储过 ...

  2. 【oracle】存储过程中获取delete语句执行后删除的记录数

    dbms_output.put_line(to_char(sql%rowcount));

  3. 懵懂oracle之存储过程

    作为一个oracle界和厨师界的生手,笔者想给大家分享讨论下存储过程的知识,因为在我接触的通信行业中,存储过程的使用还是占据了一小块的地位. 存储过程是什么?不得不拿下百度词条的解释来:"存 ...

  4. mybatis 使用oracle merge into 语句踩坑实录

    由于需求涉及oracle的clob类型字段,在mybatis的mapper xml文件中编写merge into语句时总是失败. 附上错误代码 <insert id="mergeInt ...

  5. PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

    (转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...

  6. java下实现调用oracle的存储过程和函数

    在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...

  7. Oracle中存储过程传入表名学习

    Oracle中存储过程传入表名: 一.动态清除该表的数据 create or replace procedure p_deletetable(i_tableName in varchar2)  as  ...

  8. 使用Oracle的存储过程批量插入数据

    原文地址:http://www.cnblogs.com/liaoyu/p/oracle-procedure-batch-insert.html 作者:L君还在说之乎者也 最近在工作中,需要使用生成一些 ...

  9. Oracle创建存储过程、执行存储过程基本语法

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

随机推荐

  1. 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

    基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...

  2. JNLP应用程序无法打开的解决办法

    JNLP应用程序无法打开: 1.控制面板-Java-Java 选项卡-查看.用户选项卡勾选对应版本JDK(没有就添加,路径填类似:D:\Program Files\Java\jre6\bin\java ...

  3. mycat结合双主复制实现读写分离模式

    简介:应用程序仅需要连接mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 本次实验环境架构图 服务器主机规划 主机名 IP  功能 备注 lin ...

  4. 【转】使用URL SCHEME启动天猫客户端并跳转到某个商品页面的方法

    在项目中遇到了这样一个需求:让用户在手机应用中,点击一个天猫的商品链接(知道商品在PC浏览器里的地址),直接启动天猫的客户端并显示这个商品.以前曾经实现过类似的功能,不过那次是淘宝的商品,天猫和淘宝的 ...

  5. Redis与高级语言内置的数据结构相比的异同及优势

    相关链接: 为什么要用redis而不用map做缓存? Redis的数据结构及应用场景 Redis缓存和直接使用内存的比较 Java自带的数据结构(如HashMap,BitSet等)做缓存和NoSQL( ...

  6. 《信息安全技术》实验二 Windows口令破解

    <信息安全技术>实验二 Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 实验环境 实验机Windows Server ...

  7. (转)MyEclipse快捷键大全

    -------------------------------------MyEclipse 快捷键1(CTRL)-------------------------------------Ctrl+1 ...

  8. K2 BPM介绍(1)

    K2 BPM介绍(1) 官网访问地址: 中文官网 英文官网 它是一个强大的BPM产品 K2 BPM详解 产品特性 与任何内容集成 Integrate with Anything 功能丰富的窗体 Fea ...

  9. 笔记:long、longlong、int、float、NSString相互转换

    NSString *"; // 1.字符串转int int intString = [string intValue]; // 2.int转字符串 NSString *stringInt = ...

  10. Web安全0002 - SQL注入 - 注入流程

    注:本文是学习网易Web安全进阶课的笔记,特此声明. 一.信息搜集 — 数据库类型 - 报错信息.特有语句— 数据库版本(@@version,$version)— 数据库用户— 判断数据库权限 二.数 ...