当前位置: 首页 > 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…...

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;、…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...