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) 的相关文章

  • iText7:如何获取段落的实际宽度

    在添加到文档之前 我需要知道段落的宽度 以磅为单位 我在这里搜索并找到了 Alexey 关于段落高度的答案 所以我用宽度做了它 但它不起作用 无论段落有多长 始终返回矩形的宽度 我尝试了这段代码 private float getRealP
  • 如何将 Excel 中的图表导出为图形

    我有一系列 Excel 电子表格 每个电子表格至少包含一页数据和一页根据数据创建的图表 我需要捕获 不从数据中重新生成 将现有图表作为网络友好图像 这可以通过 Java 或 Net 实现吗 我知道 POI 的东西 Java 不会这样做 或者
  • Lambda 表达式更慢?

    我有下面这段代码 PriorityQueue
  • Tomcat:具有强密码的 TLSv1.2 不起作用

    我安装了Tomcat 7 配置了对 TLSv1 2 的支持在端口 8443 上 我的连接器配置 协议 org apache coyote http11 Http11NioProtocol SSLEnabled true 方案 https 安
  • 如何通过逗号分隔将 2 行合并为一行?

    我需要将这些单独的行合并到一列 我现在如何通过逗号分隔合并列 CID Flag Value 1 F 10 1 N 20 2 F 12 2 N 23 2 F 14 3 N 21 3 N
  • 设置 MetaspaceSize 的指南 - java 8

    64 位服务器的 MetaspaceSize 默认值是多少 我在官方文档中没有找到它 我观察到 在服务器 JVM 进程中 GC 频率有时会变高并持续增长 如果我重新启动服务几次 它就会恢复稳定 我认为这是由于 JRE 升级造成的 JVM 堆
  • Java SWT 用户输入验证

    在 SWT 中进行用户输入验证时 Java 约定是什么 我读到有 FieldEditors 它们是非常方便的字段 但遗憾的是仅适用于首选项和对话框 我还了解到有一个 IValidator 接口 但它经常与数据绑定一起使用 就我而言 我的大多
  • 在 C# 中多次使用单个参数的更好方法

    我刚开始使用准备好的语句从数据库查询数据 并且在实现 C 参数 特别是 OracleParameters 时遇到问题 假设我有以下 SQL string sql select from table1 t1 table2 t2 where t
  • hibernate session 的 get() 和 load() 方法在获取方面有什么区别?

    get 和 load 方法有什么区别 关于数据获取方法 public static void main String args SessionFactory factory new Configuration configure build
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • 在单独的模块中使用 Spring AOP 方面

    我在一个 Maven 项目模块中有一个方面 com x NiceAspect 在一个单独的 Maven 模块中有一个类 com x NiceClass 这些模块具有相同的 POM 父级 共同创建一个项目 我想要实现的目标是拥有一个通用的方面
  • 如何知道一个点是否在复杂的 3D 形状内(.ply 文件)

    我正在研究一个Java女巫项目真是要了我的命 经过几天在不同论坛上的研究 寻找我真正需要的东西 我来寻求你的帮助 我的数据 ply 文件 包含由许多三角形组成的 3D 形状 一个点 3D坐标 我想知道这个点是否包含在复杂的 3D 形状内 我
  • 为什么我们在同一台服务器上使用多个应用程序服务器实例

    我想这是有充分理由的 但我不明白为什么有时我们会在同一物理服务器上放置例如 5 个具有相同 Web 应用程序的实例 这与多处理器架构的优化有关吗 JVM 或其他允许的最大内存限制 嗯 过了很长一段时间我又看到这个问题了 一台机器上的多个 J
  • 如何将模型从 ML Pipeline 保存到 S3 或 HDFS?

    我正在尝试保存 ML Pipeline 生成的数千个模型 正如答案中所示here https stackoverflow com questions 32121046 run 3000 random forest models by gro
  • 表达式的类型必须是数组类型,但它解析为浮点数

    当我编写 Java 代码时 我遇到了困难 我觉得我不知何故把这个概念弄乱了 就像我不确定这一点 void setScore float sco sco score public void setScore float sco int id
  • SWIG C 函数指针和 JAVA

    我有一些 C 代码 其中一个方法有一个函数指针作为参数 我正在尝试在我的 Android 应用程序中使用 C 代码 我决定使用 SWIG 来完成生成我需要的 java 文件的所有工作 一切都适用于常规函数 没有函数指针作为参数的函数 但我不
  • 使用从 java 程序调用的 Windows 命令提示符将具有多个连续空格的字符串作为参数传递给 jar 文件

    我想使用在另一个java程序中调用的Windows命令提示符将带有多个连续空格的字符串作为参数传递给jar文件 java 文件是这样的 它打印它的所有参数 package src public class myClass public st
  • 如何在非Spring的构造型类中使用@Autowired

    我想在此类中使用该存储库 但是当我放置像 Component 这样的构造型时 我从 IDE 收到错误 无法自动装配 未找到 身份验证 类型的 bean public class CustomMethodSecurityExpressionR
  • 注释处理工具<-检查有效注释

    I have ColumnMetadata index 1 ColumnMetadata index 2 ColumnMetadata index 3 我必须使用 APT 检查索引号是否唯一 我不知道该怎么做 我看不懂教程 一般我在网上找资
  • 如何在服务器上获取球衣日志?

    我正在使用球衣进行 REST WS 如何在服务器端启用球衣日志 很长的故事 我收到客户端异常 但我在 tomcat 日志中没有看到任何内容 它甚至没有到达我的方法 由于堆栈跟踪显示 toReturnValue 它确实从服务器获取了一些内容

随机推荐

  • 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 变