当前位置: 首页 > news >正文

DB2存储过程如何编写和执行

db2执行文件参数:
-t 表示语句使用默认的语句终结符——分号;  
-v 表示使用冗长模式,这样 DB2 会显示每一条正在执行命令的信息;  
-f 表示其后就是脚本文件;  
-z表示其后的信息记录文件用于记录屏幕的输出,方便以后的分析(这是可选的,但我们建议使用该选项)。
当使用了-t选项而没有标明语句终结符,则分号(;)会默认为语句的终结符。有时可能会出现使用另外的终结符的情况,例如用SQL PL 编写的的脚本使用其它的符号而不是默认的分号,因为分号在SQL PL 是用于定义数据库对象过程中的语句结束。
-d --end的简称,最后一个结束符
存储过程:
;作为DB2默认的SQL命令结束符,即你执行的不是一个创建存储过程的语句,而是多条不完整的SQL语句。
语句中最后一个;换成其它符号,如@,然后使用db2 -td@ -vf insert_log_test.sql(txt、sql都可以) 指定@为命令结束符。

一个简单的存储过程:
vi insert_log_test.sql

CREATE OR REPLACE PROCEDURE INSERT_LOG_TEST()
begin
atomic declare i int default 0;
  while(i <10000)
  do insert into log_test values (i,'中间提交的事务');
  set i=i+1;
  end while;
end
@

[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 -td@ -vf insert_log_test.sql
CREATE OR REPLACE PROCEDURE INSERT_LOG_TEST()
begin 
atomic declare i int default 0;
  while(i <10000) 
  do insert into log_test values (i,'中间提交的事务');
  set i=i+1;
  end while;
end

DB20000I  The SQL command completed successfully.

如果我们把最后一个@删的,然后改成;然后执行db2 -tvf会发生什么?DB2会不会把文件看出一个存储过程,而是普通的DDL语句来执行,以;为DDL等sql的分隔符

[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 -tvf insert_log_test.sql
CREATE OR REPLACE PROCEDURE INSERT_LOG_TEST()
begin 
atomic declare i int default 0
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0104N  An unexpected token "END-OF-STATEMENT" was found following "lare i 
int default 0".  Expected tokens may include:  "<psm_semicolon>".  LINE 
NUMBER=3.  SQLSTATE=42601

while(i <10000) do insert into log_test values (i,'中间提交的事务')
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0104N  An unexpected token "while(i <10000) do" was found following 
"BEGIN-OF-STATEMENT".  Expected tokens may include:  "<space>".  
SQLSTATE=42601

set i=i+1
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0206N  "I" is not valid in the context where it is used.  SQLSTATE=42703

end while
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0104N  An unexpected token "END-OF-STATEMENT" was found following "end 
while".  Expected tokens may include:  "JOIN <joined_table>".  SQLSTATE=42601

end
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0104N  An unexpected token "END-OF-STATEMENT" was found following "end".  
Expected tokens may include:  "JOIN <joined_table>".  SQLSTATE=42601

调用存储过程:
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "select count(*) from log_test"

1          
-----------
     260000

  1 record(s) selected.

[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "call insert_log_test()"       

  Return Status = 0
[db2inst1@t3-dtpoc-dtpoc-web04 liys]$ db2 "select count(*) from log_test"

1          
-----------
     270000

  1 record(s) selected.

db2 "call insert_log_test()"执行的很快,不到1秒就插入成功了,而MYSQL相同的存储过程需要大概26秒左右,没想到会这么慢。。。

直接执行存储过程:返回结果也很快,不到1秒。
[db2inst1@t3-dtpoc-dtpoc-web04 ~]$ db2 "begin atomic declare i int default 0;while(i <10000) do insert into log_test values (i,'中间提交的事务');set i=i+1;end while;end"
DB20000I  The SQL command completed successfully.

来看看MYSQL为啥这么慢,首先看他的存储过程定义:

vi insert_log_test.sql

delimiter //                            #定义标识符为双斜杠
drop procedure if exists insert_log_test;          #如果存在test存储过程则删除
create procedure insert_log_test()                 #创建无参存储过程,名称为test
begin
    declare i int;                      #申明变量
    set i = 0;                          #变量赋值
    while i < 10000 do                     #结束循环的条件: 当i大于10时跳出while循环
        insert into log_test values (i,'中间提交的事务+++++++++**********++++++++:q');    #往test表添加数据
        set i = i + 1;                  #循环一次,i加一
    end while;                          #结束while循环

end
//                                      #结束定义语句

插入10000条需要21秒多
mysql> call insert_log_test();
Query OK, 1 row affected (21.43 sec)

什么原因呢?怀疑是每插入一条就commit一次,一共commit了10000次,而DB2是插入10000条后提交了一次而已,下面来验证下
vi insert_log_test.sql
delimiter //
drop procedure if exists insert_log_test;
create procedure insert_log_test()
begin
    declare i int;
    set i = 0;
     start transaction;
    while i < 10000 do
        insert into log_test values (i,'中间提交的事务+++++++++**********++++++++');
        set i = i + 1;
    end while;
    commit;

end//
delimiter ;


mysql> source /home/mysql/liys/insert_log_test.sql;
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (0.26 sec)

mysql> select count(*) from log_test;
+----------+
| count(*) |
+----------+
|   410000 |
+----------+
1 row in set (0.15 sec)

mysql> call insert_log_test();
Query OK, 0 rows affected (0.27 sec)

mysql> select count(*) from log_test;
+----------+
| count(*) |
+----------+
|   420000 |
+----------+
1 row in set (0.15 sec)

结果证明猜想是对的

相关文章:

DB2存储过程如何编写和执行

db2执行文件参数&#xff1a; -t 表示语句使用默认的语句终结符——分号&#xff1b;   -v 表示使用冗长模式&#xff0c;这样 DB2 会显示每一条正在执行命令的信息&#xff1b;   -f 表示其后就是脚本文件&#xff1b;   -z表示其后的信息记录文件用于记录屏幕的输出&am…...

SpringBoot + FFmpeg实现一个简单的M3U8切片转码系统

简介 在本文中&#xff0c;我们将使用SpringBoot和FFmpeg来实现一个简单的M3U8切片转码系统。M3U8是一种常用的视频流媒体播放列表格式&#xff0c;而FFmpeg则是一个强大的音视频处理工具。 技术栈 SpringBoot&#xff1a;一个基于Spring框架的快速开发平台。FFmpeg&#xf…...

SpringCloud(35):Nacos 服务发现快速入门

本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud 应用程序与 Nacos 的无缝集成。 通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务。 1 Spring…...

OSPF实验:配置与检测全网互通

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. 配置 IP 地址2. 按照图示分区域配置 OSPF &#xff0c;实现全网互通3. 检查是否全网互通 摘要&#xff1a; 本篇文章介绍了一个 OSPF&#xff08;Open Shortest Path First&#xff09;实验&#xff0c;旨在…...

常见的五种设计模式

https://www.runoob.com/design-pattern/factory-pattern.html 单例模式 **意图&#xff1a;**保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 **主要解决&#xff1a;**一个全局使用的类频繁地创建与销毁。 **何时使用&#xff1a;**当您想控制实例数目…...

pandas读取一个 文件夹下所有excel文件

我这边有个需求&#xff0c;是要求汇总一个文件夹所有的excel文件&#xff0c; 其中有.xls和 .xlsx文件&#xff0c;同时还excel文件中的数据可能还不一致&#xff0c;会有表头数据不一样需要一起汇总。 首先先遍历子文件夹并读取Excel文件&#xff1a; 使用os库来遍历包含子文…...

Python网页请求超时如何解决

在进行网络爬虫项目时&#xff0c;我们经常需要发送大量的请求来获取所需的数据。然而&#xff0c;由于网络环境的不稳定性&#xff0c;请求可能会因为超时而失败。请求超时可能导致数据获取不完整&#xff0c;影响爬虫的效率和准确性。此外&#xff0c;频繁的请求超时可能会被…...

虚幻引擎集成web前端<二>:UE4 像素流 与 web 通信

Vue 和 Unreal Engine (UE) 之间的通信可以通过多种方式实现。以下是一些建议的方法&#xff1a; 使用 Websockets&#xff1a;Websockets 是一种在客户端和服务器之间进行双向通信的技术。在 Vue 端&#xff0c;你可以使用一个 Websockets 库&#xff08;如 socket.io&#xf…...

618-基于FMC+的XCVU3P高性能 PCIe 载板 设计原理图

基于FMC的XCVU3P高性能 PCIe 载板 一、板卡概述 板卡主控芯片采用Xilinx UltraScale16 nm VU3P芯片&#xff08;XCVU3P-2FFVC1517I&#xff09;。板载 2 组 64bit 的DDR4 SDRAM&#xff0c;支持 IOX16或者 JTAG 口&#xff0c;支持PCIe X 16 ReV3.0以及 FMC 扩展接口。…...

ABB UF C911B108 3BHE037864R010控制主板模块

ABB UF C911B108 3BHE037864R010 控制主板模块通常用于ABB的工业自动化和控制系统中&#xff0c;作为关键组件之一&#xff0c;用于执行控制、监测和通信任务。以下是通常情况下控制主板模块的一些产品功能&#xff1a; 高性能处理器&#xff1a;ABB UF C911B108 3BHE037864R01…...

基于SpringBoot开发的疫情信息管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 疫情信息管理系统,java项目。 eclipse和…...

手敲Cocos简易地图编辑器:人生地图是一本不断修改的书,每一次编辑都是为了克服新的阻挡

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》&#xff0c;欢迎大家关注分享收藏订阅。 在上一篇文章&#xff0c;笔者给大家讲解了在Cocos独立游戏开发框架中&#xff0c;如何自定义实现Tile地图管理器&#xff0c;成功地在游戏中优化加载一张特大的地图。接下来…...

MySQL——修改数据库和表的字符编码

修改编码&#xff1a; &#xff08;1)先停止服务 &#xff08;2&#xff09;修改my.ini文件 &#xff08;3&#xff09;重新启动服务说明&#xff1a; 如果是在修改my.ini之前建的库和表&#xff0c;那么库和表的编码还是原来的Latin1&#xff0c;要么删了重建&#xff0c;要么…...

中国人民大学与加拿大女王大学金融硕士——人生总要逼自己一把

我们每个人都是一个独特而丰富的个体&#xff0c;身上蕴藏着各种潜力和可能性。要不断去开发自己的潜能&#xff0c;不断学习和提升自己的知识和技能&#xff0c;保持对新知识和趋势的敏感。想要在职场上走得更远&#xff0c;就要逼自己一把&#xff0c;在职继续攻读硕士学位是…...

SAP MM学习笔记 - 错误 ME092 - Material mainly procured internally(原则上该物料只能内部调达)

购买依赖&#xff0c;购买发注的时候&#xff0c;会出一些错误或警告&#xff0c;碰到的时候&#xff0c;能解决的话&#xff0c;咱们就记录一下。 比如 Msg 番号 ME092 该品目原则上是内部调达。 如下图&#xff0c;本次出这个错误的原因是&#xff0c;ME51N做购买依赖&…...

【EI会议征稿】2023年智能科学与计算机工程国际学术会议(ISCE 2023)

2023年智能科学与计算机工程国际学术会议&#xff08;ISCE 2023&#xff09; 2023 International Conference on Intelligence Scicence andComputer Engineering 2023年11月3-5日 中国-西双版纳 迄今为止&#xff0c;人工智能研究在一些特殊领域取得了一定的实质性进展。然…...

Java多线程编程

目录 1、一个线程的生命周期 2、创建一个进程 2.1 Thread 方法 2.2 通过Runnable接口 2.3 通过继承Thread类本身 2.4 通过Callable和 Future创建进程 2.5 创建线程的三种方式的对比 3、线程的状态 4、线程同步 4.1 同步代码块 4.2 同步方法 5、使用wait和notify 6…...

Windows wsl2安装Ubuntu

wsl&#xff08;Windows Subsystem for Linux&#xff09;即适用于Windows的Linux子系统&#xff0c;是一个实现在Windows 10 / 11上运行原生Linux的技术。 wsl2 为其迭代版本&#xff0c;可以更好的在Windows上运行Linux子系统。 这里以 Windows 11 安装Ubuntu作为示例。 开启…...

csp-j模拟赛1总结

文章目录 T1T2T3结语 尾声 快csp考试了得多刷题啊… 题海战术,启动(玩OI玩的) 咳咳,进入正题. T1 T1 水题,小学数学即可搞定,话不多说,上代码: #include <iostream> using namespace std; int main(){int n,t;cin>>n>>t;bool y0;unsigned long long int nu…...

有哪些做流程图的软件?分享一些制作方法和注意事项

流程图是一种常用的图表&#xff0c;可以用于表示各种工作流程、系统架构、决策流程等。在现代工作生活中&#xff0c;制作流程图已经成为了必备的技能之一。本文将介绍一些常用的做流程图的工具&#xff0c;并分享一些制作方法和注意事项。 做流程图的工具 1.迅捷画图&#x…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...