oracle sql loop merge,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;

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七月暴雨

狼是弱者 是生命无从着落的弱者 是黯然神伤的异族 它们此刻在星光月夜里 悲情地凝望厮守缠绵过的故园 在逡巡的感伤里作别 为了生命 为了延续 选择死亡或者选择离去 就像时间无意从指间滑过一样 悄悄的溜走 没有…

【OpenFlow】OpenFlow1.3协议基于Mininet部署与验证

实验参考: OpenFlow1.3协议基于Mininet部署与验证 实验步骤: 1. 安装mininet,具体步骤请看实验参考。 2. Mininet创建拓扑后连接支持OpenFlow1.3的控制器: 在连接前,可以通过命令确认控制器的端口号: 3. 进…

【OpenDaylight】OpenDaylight的C/S模式实验

实验参考: OpenDaylight的C/S模式实验 实验步骤: 1. 启动OpenDaylight: 查看是否开启: 或: 2. 查看OpenDaylight的IP地址: 3. 用Miniet创建简易拓扑并连接ODL: 4. 在OpenDaylight虚拟机上查看监…

linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法

vnc的默认端口是自己配置的,并不是这有一个端口号。通过打开/etc/sysconfig/vncservers。 这里就配置了2个桌面,一个桌面号是1, 一个是2.这里的配置的参数VNCSERVERS"2:root"VNCSERVERARGS[2]"-geometry 1280x800"就可以…

linux怎么查看本地磁盘空间,linux怎么查看磁盘空间

如果你在使用Linux过程中遇到无法读写磁盘,应用程序无法执行,请求响应不了等问题,那多半是Linux系统磁盘空间满了,那么怎么查看Linux磁盘空间呢?下面跟着学习啦小编一起来了解一下吧。linux怎么查看磁盘空间首先如果需要查看整个…

[hdu5629]Clarke and tree

首先由一个神奇的序列叫做Purfer序列,他可以表示一棵树,且每个节点出现此时为度数-1(因此总长为n-2)。 然后dp,用f[i][j][k]表示用前i个点中的j个点构成了一个长度为k的Purfer序列(当然要符合条件),那么有$…

linux指令与数据库,Linux指令每日背诵(第一天)

了解:Linux 命令的分类:内部指令、外部指令。Shell 在用户和内核之间充当了“翻译官”的角色。掌握:四种指令方式:1、命令字;2、命令字选项;3、命令之参数;4、命令字选项参数;命令字…

Scott Mitchell 的ASP.NET 2.0数据教程之五:: 声明参数

导言 在上一章的教程中,我们看了GridView、DetailsView和FormView绑定到OjbectDataSource控件显示数据,ObjectDataSource调用了类ProductsBLL的GetProducts()方法。方法GetProducts()返回一个有Northwind数据库的Products表的所有记录组成的强类型数据表…

IArea

用于获取一个几何对象的面积 IArea接口的第一个属性Area(只读,返回一个double类型的数值,为此Area的面积)IArea接口的第二个属性Centroid(只读,返回一个IPoint类型的变量,为此Area的重心&#x…

linux coreutils升级,Coreutils

Coreutils提供了配置工具,定义颜色代码更加方便;Coreutils包含的不仅仅是ls,同时作为Linux用户,我更习惯于使用GNU的各种shell工具。其实就是安装了Coreutils,就可以使用Linux下的程序,【ls/mkdir/mv】等等…

IDEA插件:search with bing、search with baidu

//转载请注明出处:https://www.cnblogs.com/nreg/p/11267169.html 当项目出现错误时,经常需要复制错误信息粘贴到浏览器查询,但是手动复制再粘贴太麻烦了, 因此IDEA官方给了右键菜单search with google, 感觉上方便了许多&#xf…

oracle 游标(学校)

这段时间实在是很忙,结婚、赶项目进度、被迫出书、教学。每件事都是不能得罪的。。。。前几天帮教务处修正oracle数据库数据问题,把代码贴出来防止以后找不到了 declareCURSORcurTTT isselectXN,XM,XQ,KCMC,XF,BJMC fromCJB;XN1 VARCHAR2(10);XM1 VARCHA…

[原创]公布读取瑞星注册码的小程序源代码

大概一年多了,瑞星一直都没更改其序列号保存方式。这还是偶在学校时无聊研究的。偶是菜鸟,就不多说了。 关键代码如下: 1stringrisingpath;2inti, j 0; longsnoffset, idoffset;34//以下读取5//HKEY_LOCAL_MACHINE\SOFTWARE\rising\Rav,并存在…

Selenium 2自动化测试实战4(引用模块)

一、模组1.模组也叫类库或模块,引用模块 在python中,通过import….或from….import….的方式引用模块,下面引用time模块 import time print (time.ctime())#输出结果为“Tue Jul 30 11:34:32 2019”在time模块下面有一个ctime()方法用于获得当…

appsan可以扫描linux吗,[经验]使用appscan实现多站扫描简单自动化

随着年龄增长,身上负担的压力也越来越大。在工作中很多时候都会需要短时间内扫描多个网站,可能是平时时间不够,或者是客户特别要求,很多时候工作中的扫描工作要放在晚上睡觉时间来做。但是白天忙了一天,晚上不可能一直…

tinyxml c语言,开源TinyXML 最简单的新手教程

TinyXML它是基于一个非常受欢迎的现在DOM型号XML解析器,简单易用且小巧玲珑,很适合存储简单数据。配置文件。当前最新版本号是2.6.2先看一下源代码文档的结构:Docs是帮助文档。里边有许多的使用说明,只截一张图看一下:…

C#开发高亮语法编辑器(一)——TextBox ,RichTextBox

C#简单实现高亮语法编辑器(一)——TextBox ,RichTextBox的局限性一、RichTextBox基本设置二、实现语法高亮三、关键字提示四、实现行号就简单快速得开发文本编辑器TextBox 最为简单,大家用得也多,缺点是无法实现复杂的操作。RichTextBox虽然是则功能比它…

c语言即时通讯软件源码,即时通讯软件源码-基于c语言即时通讯软件代码实现

我不知道哪种语言无关紧要。开源,我不知道该用什么。即时通讯软件源代码为JAVA语言对于即时通讯软件源代码最好是用C语言编写的,想学一下,感谢您即时通讯软件有什么。includewinscock2、h#includewinscock2、h#includesting。h#includewindow…

探讨继承与实现(二)

前文 探讨继承与实现(一) 根据双鱼座的提示已经更新。很不巧,我也是双鱼座的。由于水平有限,有什么不足还请大家指教。2007年2月1日 http://www.cnblogs.com/birdshover/目录:一、抽象的产生二、依赖抽象三、抽象的损…

实现android应用程序自动化测试的批处理脚本,简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本...

一、前言好久没写帖子,去年晋升为 leader 之后工作比较忙,去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试,到今天为止跑了将近半年,前期感觉还行,但随着用例的增加,执行自动化脚本的时间…