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. 进…

oracle gets/exec 单位,ORACLE AWR使用基础

ORACLE AWR使用基础Oracle Database 10g 提供了一个显著改进的工具:自动工作负载信息库(AWR)。Oracle 建议用户用这个取代Statspack。AWR 实质上是一个Oracle 的内置工具,它采集与性能相关的统计数据,并从那些统计数据中导出性能量度&#xf…

思科(Cisco)IOS 12.3特性分析[ZT]

cisco的ios 12.3和其子版本不仅包含增加的基本变化和漏洞修复。一起来近距离体验12个最有用的变化,包括网络准入控制(nac),最优边缘路由,动态多点***,ipsec全状态故障恢复等。      可能会有少数网络工…

【OpenFlow】OpenFlow1.0协议分析

实验参考: OpenFlow1.0协议分析 实验步骤: Coming soon... 转载于:https://www.cnblogs.com/ptolemy/p/11257083.html

vs连接oracle数据库报错,用VS连接oracle数据库时ORA-12504错误

Android中的AlertDialog使用示例二(普通选项对话框)在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,AlertDialog实现方法为建造者模式. ...OpenCV2学习笔记05:矩阵翻转对图像进行翻…

红龙大虾不能吃!

南京街头基本上所有的饭店、餐厅都再热买 红龙大虾,特别是世界杯期间,边看球边喝啤酒边吃红龙大虾几乎是所有餐厅的热门选择。但今天网上看了一编文章,才发现原来这个红龙大虾是万万不能吃的! 下面内容转自网易社区--------------…

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

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

网管日志-06.07.24

现在时间是20:36分钟,我仍在机房工作着,还是那条光纤透明链路,本应该上个周就可以完成的工作,却一直拖到现在还没有解决,第一次是因为电信没有携带壁挂的odf,只能在机架式odf的一个法兰盘上熔接光纤&#x…

matlab平稳随机过程的功率谱密度,平稳随机过程的功率谱密度

《平稳随机过程的功率谱密度》由会员分享,可在线阅读,更多相关《平稳随机过程的功率谱密度(27页珍藏版)》请在人人文库网上搜索。1、平稳随机过程的功率谱密度,一、平稳过程的功率谱密度,假如 x( t ) 满足狄利克雷 (Dirichlet) 条件,且,绝对可积, 即,那么…

【OpenDaylight】OpenDaylight及Postman实现VxLAN网络实验

实验参考: OpenDaylight及Postman实现VxLAN网络实验 实验步骤: Coming soon... 转载于:https://www.cnblogs.com/ptolemy/p/11257095.html

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

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

Event Organization Site - To be published on 4th August

www.asp.net The first "By the Community, For the Community" sample! Do not forget it!

【OpenDaylight】OpenDaylight二层转发机制实验

实验参考: OpenDaylight二层转发机制实验 实验步骤: Coming soon... 转载于:https://www.cnblogs.com/ptolemy/p/11257102.html

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

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

使用主题文件(包含CSS文件)时遇到的问题

出错提示:使用主题 css 文件要求页上有标头控件。解决方案:要在<head>标签中加入runat属性(即:将<head>标签作为服务器控件使用),如下:<html><head runat"server"></head><body></body></html> 转载于:https://www.…

[hdu5629]Clarke and tree

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

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

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

进程间内存共享问题[转]

http://www.vkfz.com/net-CreateFileMapping-t55403.htmplayroc 发表于 2006-2-27 23:21:08 超级难题&#xff1a;.net 中CreateFileMapping 创建共享内存问题.net中可以通过InteropServices调用unmanaged库的方法CreateFileMapping等来创建和使用共享内存。但是如何将一个对象…

linux中如何统计目录中的文件,[Linux目录文件]在Linux中统计目录内文件

//调用opendir和readdir函数对指定目录进行遍历操作//然后打印输出指定目录中各种类型的文件数目#include #include #include #include #include #include #include typedefint Myfunc(const char *, const struct stat *, int); //定义一个函数static Myfunc myfunc;static …