SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12)

2023-11-16

SQL编程基础

A.编程环境:

 即存储过程、触发器和函数中进行SQL编程,所以有些语法并不能应用于普通的SQL应用场景,如命令行直接SQL查询。

B.变量声明:

(1)全局变量

声明:set @变量名 = 值;
读取:select @变量名
在这里插入图片描述
赋值

  • set @变量名=表达式;
  • select @变量名:=表达式;-- 会输出结果集
  • select 表达式 into @变量名;–不输出结果集
(2)普通变量

声明:declare 变量名 类型 [default 默认值];
读取、赋值:同上

C.语句块

[lable_name:] BEGIN

    // 代码

   END [lable_name]

D.逻辑语句

MySQL支持两种判断,第一个是if判断,第二个 case判断

if语法
单分支
if 条件 then
    //代码
end if;

双分支
if 条件 then
    代码1
else
    代码2
end if;

多分支
if 条件 then
    代码1
elseif 条件 then
    代码2
else
    代码3
end if;

E.case语句

语法1:简单case函数

case sex
  when '1' then '男'
  when '2' then '女’
else '其他' end

语法2:case搜索函数

case when sex = '1' then '男'
         when sex = '2' then '女'
else '其他' end

F.循环语句

1.loop

语法:

lable_name:loop
	...
    leave lable_name --退出循环
    ...
end loop;
2.REPEAT

语法:

[lable_name:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [lable_name]

实例:

delimiter //
CREATE PROCEDURE ps_repeat ( p1 INT ) BEGIN
	SET @x = 0;
	REPEAT
			SET @x = @x + 1;
		UNTIL @x > p1 
	END REPEAT;
END //
3.while

语法:

while 条件 do
    //代码
end while;

实例:

delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
  WHILE p1 > 0 DO
    SET p1 = p1 - 1;
  END WHILE;
END//
4.游标

语法:
1.定义游标:declare 游标名 cursor for select语句;
2.打开游标:open 游标名;
3.获取结果:fetch 游标名 into 变量名[,变量名];
4.关闭游标:close 游标名;
实例:

delimiter //
create procedure p3()
begin
    declare value1 int;
    declare value2 int;
    -- 声明游标
    declare mc cursor for select id,name from old_tab;
    -- 打开游标
    open mc;
    -- 获取结果
    fetch mc into value1,value2;
    -- 这里是为了显示获取结果
    select value1,value2;
    -- 关闭游标
    close mc;  
end//

call p3

G.存储过程

 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集。存储在数据库中,经过第一次编译后再次调用不需要再次编译。可设定只有某些用户才具有对指定存储过程的使用权,这展现了其安全性。
(1)查看现有的存储过程。
语法:

SHOW  PROCEDURE  STATUS  [ LIKE ' pattern ' ] ;

实例:

show procedure status from mysql like '%p1%'

(2)创建存储过程
语法:
注意:delimiter是声明定界符,用以区分sql语句(;)和存储过程(//)结尾定界符
参数说明:参数分为 in 输入函数(默认) out输出函数 inout输入输出函数

delimiter //
CREATE PROCEDURE ps_name (参数1,参数2,参数3,...)
BEGIN
  sql代码
END//

实例:

delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
  WHILE p1 > 0 DO
    SET p1 = p1 - 1;
  END WHILE;
END//

 存储过程的参数分为输入参数(in)、输出参数(out)、输入输出参数(inout),默认是输入参数。如果存储过程中就一条语句,begin和end是可以省略的。

说明:

  • 存储过程中,可有各种编程元素:变量,流程控制,函数调用;

  • 还可以有:增删改查等各种mysql语句;

  • 其中select(或show,或desc)会作为存储过程执行后的"结果集"返回;

  • 形参可以设定数据的"进出方向":

(3)调用存储过程

语法:call 存储过程()

(4)删除存储过程

语法:drop procedure [if exists] 存储过程名

(5)存储过程典型案例

1.各种类型输入输出参数
实例:
在这里插入图片描述
结过说明:除了in,传入的参数@a没有改变以外,out和inout都改变了传入的参数@b,@c

2.简单查询
实例:
在这里插入图片描述

3.插入数据
实例:

delimiter //
drop procedure if exists insert1;
create procedure insert1()
begin
DECLARE i int;
set i = 0;
WHILE i<100 do 
insert into tab1(id,username) values(i,CONCAT('username',i));
set i = i+1;
end while;
end//

4.游标遍历插入
实例:

tip:	declare continue handler for not found set flag = 1;

delimiter //
create procedure p3()
begin
    declare value1 int;
    declare value2 int;
		declare value3 varchar(32);
		declare flag int default 0;
    -- 声明游标
    declare mc cursor for select * from old_tab;
		declare continue handler for not found set flag = 1;
	
    -- 打开游标
    open mc;
		l1:loop
    fetch mc into value1,value2,value3;
		if flag=1 then
			leave l1;
			end if;
      insert into new_tab values(value2,value3,value1);
    -- 这里是为了显示获取结果
    -- 关闭游标
		end loop;
    close mc;  
			
end//

call p3

5.综合实例:变量,select into 变量赋值,游标,循环
实例:

delimiter //
create procedure selecttab1()
begin
DECLARE i int;
declare username VARCHAR(255);
-- 定义游标
declare selecttab1_cursor CURSOR for select id, username from tab1 ;
-- 打开游标
open selecttab1_cursor;
-- 首次填充数据到变量
FETCH next from selecttab1_cursor into i,username;
-- 循环游标
read_loop: LOOP
select i,username;
-- 再次填充数据到变量
FETCH next from selecttab1_cursor into i,username;
END LOOP;
-- 关闭游标
close selecttab1_cursor;
end//

6.存储过程动态执行sql

delimiter //
create procedure dongtaisql()
begin
declare v_sql varchar(500); -- 需要执行的SQL语句 
DECLARE i int;
set i = 0;
WHILE i<10 do 
set v_sql= concat('insert into tab2(id,username) values(',i,', \'username',i,'\');'); 
set @v_sql=v_sql; -- 注意很重要,将连成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
prepare stmt from @v_sql; -- 预处理需要执行的动态SQL,其中stmt是一个变量 
EXECUTE stmt; -- 执行SQL语句 
deallocate prepare stmt; -- 释放掉预处理段 
set i = i+1;
end while;
end//

H.函数

(1)创建函数
语法:

create function 函数名(参数,参数的类型) returns 返回值类型

begin

    //代码

end

实例:

create function fun1() returns int
begin 
    declare c int;
    select id from old_tab into c;
    return c;
end;

(2)mysql内置函数
参考:mysql函数参考手册

I触发器

(1)简介

  • 触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。

  • 触发器必须定义在特定的表上。

  • 自动执行,不能直接调用,

  • 作用:监视某种情况并触发某种操作。

(2)触发器四要素
在这里插入图片描述
(4)创建触发器

语法:

create trigger trigger_name

after/before insert /update/delete on 表名

for each row

begin

// 代码

end

实例:

delimiter // 
CREATE TRIGGER tr_new_tab_insert 
after insert on new_tab 
for Each row
begin 
insert into old(id,name,valid) values(new.id,new.name,new.valid); 
end //

提示:new.字段名 可以访问新值,old.字段名可以访问旧值。

(5)查看触发器

语法: show triggers

(6)删除触发器

语法:drop trigger trigger_name

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12) 的相关文章

  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • c++模板(函数模板,类中函数模板,类模板)

    作用 减少程序中的冗余信息 如 多个函数或类的除了参数类型外 其余都完全相同时 可以使用模板来减少重复信息 参考函数重载时 输入参数数量也相同的情况 1 函数模板 即建立一个通用函数 只不过该函数的返回类型和形参类型都不具体指定 其定义格式
  • Python实现找零兑换的三种解法

    找零兑换 找零兑换问题最直接的解法就是贪心策略 比如问题 有面值1 5 10 25的硬币 求解兑换63元所需的最少硬币数 贪心策略的思想就是不断的利用面值最大的硬币去尝试 不行了 在尝试较小面值的硬币 该例中也即使用25的硬币去尝试 2枚2
  • 华为服务器怎么换系统,云服务器怎么更换系统

    云服务器怎么更换系统 内容精选 换一换 弹性云服务器系统密码涉及到客户重要的私人信息 提醒您妥善保管密码 如果您忘记密码或密码过期 可以重置密码 如果弹性云服务器提前安装了密码重置插件 请参见在控制台重置弹性云服务器密码 使用公共镜像的弹性
  • 【简单易用】基于Qt的跨平台自定义标题栏控件QJamWindow

    一 概述 QJamWindow是一个基于Qt的跨平台自定义标题栏控件 你可以通过它方便得设计出属于自己的标题栏 特性 1 标题栏高度可调 标题栏背景色设定 2 图标及其尺寸 图标背景色设定 3 Control box宽度 鼠标经过 按下颜色
  • JAVA基础必备功能之导出ZIP文件

    导出ZIP文件 比较常用的两种 导出图片压缩文件 导出excel压缩文件 导出思路 需要导出的文件转存为byte数组保存到Map 然后遍历压缩成zip 需要引入jar
  • 链表— —循环链表的算法实现

    Joseph问题 有 10 个小朋友按编号顺序 1 2 10 顺时针方向围成一圈 从 1 号开始顺时针方向 1 2 9 报数 凡报数 9 者出列 显然 第一个出圈为编号 9 者 最后一个出圈者的编号是多少 第 5 个出圈者的编号是多少 in
  • lintcode 631 · 最大矩阵II【矩阵 中等 vip】

    题目 https www lintcode com problem 631 给出一个只有 0 和 1 组成的二维矩阵 找出最大的一个子矩阵 使得这个子矩阵的主对角线元素均为 1 其他元素均为 0 你可以认为所求的矩阵一定是一个方阵 主对角线
  • 组是由圆括号分开的正则表达式 随后可以根据它们的组号进行调用 第 0 组表示整个匹 配表达式 第1 组表示第 1 个用圆括号括起来的组 等等 因此 在表达式 A B C D 中 有 3 个组 第 0 组 ABCD 第 1 组是 BC 以及第
  • Acwing790.数的三次方根

    解题思路 include
  • Pandora-ChatGPT(离线安装教程)(附安装包)

    要安装Pandora ChatGPT 1 1 0 tar gz 您可以按照以下步骤进行操作 安装包 https wwue lanzouj com iOMwG0yeozxg 解压缩文件 tar xvf Pandora ChatGPT 1 1
  • 设置bitmap的宽高,同时将bitmap转换为file对象

    public class BitmapToSizeChangeFile 将bitmap转换为file存储起来 param bitmap return public static File
  • Dijkstra C艹板子

    迪杰斯特拉算法主要特点是从起始点开始 采用贪心算法的策略 每次遍历到始点距离最近且未访问过的顶点的邻接节点 直到扩展到终点为止 题源 最短路 蓝桥云课 lanqiao cn 如下图所示 G 是一个无向图 其中蓝色边的长度是 1 橘色边的长度
  • 绕过JavaScript debugger三种解决方法

    最近网上挺火的一段加密混淆JS 格式化展开后有300多行 目的是解析生成一个cookie 不携带cookie 就不能加载网页源码 典型的反爬虫操作 看后觉得好使的请记得点赞哦 烧鸡么么哒 谢谢 JS会自动监视是否打开了调试器 如果打开了 就
  • STM32锁住,解开方法

    一 STM32 被锁住后的解开方法 问题 STM32 JTAG SWD禁用导致无法烧写 由于STM32的引脚功能较多 在为了方便硬件的使用 常会使用复用重映射的功能 这里主要涉及的是SWD和JTAG端口的引脚对应出现的问题 为了使得TIM2
  • php之RSA加密解密

    介绍 RSA算法属于非对称加密算法 非对称加密算法需要两个秘钥 公开密钥 publickey 和私有秘钥 privatekey 公开密钥和私有秘钥是一对 如果公开密钥对数据进行加密 只有用对应的私有秘钥才能解密 如果私有秘钥对数据进行加密那
  • Linux下nginx的安装以及环境配置

    linux下nginx的安装以及环境配置 刚好最近在处理服务器相关的工作 所以记录一下nginx的安装 ok 接下来直接开始操作 第一步 下载nginx压缩包 在这里可以去nginx官网下载 gt 点我下载nginx 也可以直接使用wget
  • 【解惑】一文告诉你,该学R还是Python!

    Python和R是统计学中两种最流行的的编程语言 R的功能性主要是统计学家在开发时考虑的 R具有强大的可视化功能 而Python因为易于理解的语法被大家所接受 在这篇文章中 我们将重点介绍R和Python以及它们在数据科学和统计上地位之间的
  • 提高 React 项目整洁度的 21 个最佳实践

    React 在如何组织结构方面非常开放 这正是为什么我们有责任保持项目的整洁和可维护性 今天 我们将讨论一些改善 React 应用程序健康状况的最佳实践 这些规则被广泛接受 因此 掌握这些知识至关重要 所有内容都将以代码展示 所以做好准备
  • 端口扫描技术

    端口扫描 常见的扫描类型 全连接扫描 TCP connect 扫描 半连接扫描 TCP SYN 扫描 IP 头信息 dumb 扫描 秘密扫描 TCP FIN 扫描 TCP ACK 扫描 NULL 扫描 XMAS 扫描 SYN ACK 扫描
  • SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12)

    SQL编程基础 A 编程环境 即存储过程 触发器和函数中进行SQL编程 所以有些语法并不能应用于普通的SQL应用场景 如命令行直接SQL查询 B 变量声明 1 全局变量 声明 set 变量名 值 读取 select 变量名 赋值 set 变