2.5 Oracle之存储过程和MERGE INTO语句
一、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语句的更多相关文章
- oracle数据库存储过程中的select语句的位置
导读:在oracle数据库存储过程中如果用了select语句,要么使用"select into 变量"语句要么使用游标,oracle不支持单独的select语句. 先看下这个存储过 ...
- 【oracle】存储过程中获取delete语句执行后删除的记录数
dbms_output.put_line(to_char(sql%rowcount));
- 懵懂oracle之存储过程
作为一个oracle界和厨师界的生手,笔者想给大家分享讨论下存储过程的知识,因为在我接触的通信行业中,存储过程的使用还是占据了一小块的地位. 存储过程是什么?不得不拿下百度词条的解释来:"存 ...
- mybatis 使用oracle merge into 语句踩坑实录
由于需求涉及oracle的clob类型字段,在mybatis的mapper xml文件中编写merge into语句时总是失败. 附上错误代码 <insert id="mergeInt ...
- PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)
(转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...
- java下实现调用oracle的存储过程和函数
在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...
- Oracle中存储过程传入表名学习
Oracle中存储过程传入表名: 一.动态清除该表的数据 create or replace procedure p_deletetable(i_tableName in varchar2) as ...
- 使用Oracle的存储过程批量插入数据
原文地址:http://www.cnblogs.com/liaoyu/p/oracle-procedure-batch-insert.html 作者:L君还在说之乎者也 最近在工作中,需要使用生成一些 ...
- Oracle创建存储过程、执行存储过程基本语法
>>>>>>>>>>>>>>>>>>>>>>>>> ...
随机推荐
- 原生js实现一个DIV的碰撞反弹运动,并且添加重力效果
继上一篇... 原生js实现一个DIV的碰撞反弹运动,并且添加重力效果 关键在于边界检测,以及乘以的系数问题,实现代码并不难,如下: <!DOCTYPE html> <html la ...
- windows10 激活方法
1.“以管理员身份”运行 依次输出以下命令: slmgr.vbs /upk 2. 接着输入以下命令: slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX 3. 继续输入以 ...
- P1439 【模板】最长公共子序列
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- RLE Iterator LT900
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- NSPredicate的使用
简述 NSPredicate谓词条件过滤器,一般用于过滤数组数据,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 常用函数 创建谓词 + (NSPredicate *)predic ...
- 微信小程序、安卓APP、苹果APP对比分析
今天的话题主要是关于微信小程序.安卓APP.苹果APP对比分析.既然是对比分析肯定是将它们一个一个说明. 本篇不涉及技术话题,只讲解微信小程序.安卓APP.苹果APP它们各自的优缺点及其应用场景. 一 ...
- saltstack之混合匹配
需要-C参数: salt -C ## 使用grains属性来匹配 [root@hadoop0 pillar]# salt -C 'G@os:Ubuntu' test.ping uadoop1: Tru ...
- PAT乙级1029
1029 旧键盘 (20 分) 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 ...
- C语言程序设计I—第八周教学
第八周教学总结(21/10-27/10) 教学内容 第三章 分支结构 3.1 简单的猜数游戏 3.2 四则运算 课前准备 在蓝墨云班课发布资源:chap03_分支结构.pptx PTA:2018秋第八 ...
- Y310 线刷
以下操作都是在XP 32位 系统下执行,64位以及WIN7 WIN8均未测试. ① 下载并安装 spreadtrum_android_24027_32.exe 驱动.(如驱不上,请使用最新版本的驱动精 ...