存储过程(SQL)

1.存储过程

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

2.MySQL存储过程创建

1.语法
sql 复制代码
#创建存储过程
CREATE PROCEDURE 存储过程名 ([[IN|OUT|INOUT]] 参数名 数据类型) 过程体;

#删除存储过程
DROP PROCEDURE IF EXISTS 存储过程名;
sql 复制代码
#删除存储过程
DROP PROCEDURE IF EXISTS  adduser;

#创建存储过程
CREATE PROCEDURE adduser(num DOUBLE)
BEGIN
  UPDATE `user` SET money = money - num WHERE name = '张三';
  UPDATE `user` SET money = money + num WHERE name = '李四';
END;
2.过程体
sql 复制代码
BEGIN
  过程体
END;

过程体每条SQL语句用';'隔开
3.参数

IN:

不管存储过程里面的参数怎么改变,都不影响外部变量。

OUT:

不管参数传入之前的定义是什么,在存储过程中都为null。

存储过程里面对参数的改变,都会影响外部变量。

INOUT:

参数在外部定义后,会将定义的变量传入。

存储过程里面对参数改变,都会影响外部的变量。

sql 复制代码
#IN0
CREATE PROCEDURE add2(IN num INT(20))
BEGIN
  SET num = 111;
  SELECT num;
END;

SET @a = 123;
CALL add2(@a);
SELECT @a;
sql 复制代码
#OUT
CREATE PROCEDURE add3(OUT num INT(20))
BEGIN
  SELECT num;
  SET num = 111;
END;

SET @a = 123;
CALL add3(@a);
SELECT @a;
sql 复制代码
#INOUT
CREATE PROCEDURE add3(INOUT num INT(20))
BEGIN
  SELECT num;
  SET num = 111;
  SELECT num;
END;

SET @a = 123;
CALL add3(@a);
SELECT @a;
4.变量

使用 DECLARE 定义变量(只能在存储过程、函数或触发器中使用)。

变量赋值:

1.使用 DEFAULT 默认赋值。

2.使用 SET 赋值。

3.使用 SELECT...INTO... 赋值。

sql 复制代码
DROP PROCEDURE IF EXISTS  add1;
CREATE PROCEDURE add1()
BEGIN
  #默认值
  DECLARE a INT(20) DEFAULT 1;
  DECLARE b INT(20);
  DECLARE c VARCHAR(255);
  #使用set为变量赋值
  SET b = 2;
  SELECT a;
  SELECT b;
  #使用SELECT...INTO...为变量赋值
  SELECT name INTO c FROM user WHERE id = 1; 
  SELECT c;
END;

CALL add1();

用户变量:

用于在 SQL 语句和存储过程之间传递数据。

用法:

@变量名

在使用用户变量之前,最好先初始化它,否则它的值将是 null。

变量作用域:

内部变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,不再可见了,在存储过程外再也找不到这个内部变量,但是可以通过out参数或者将其值指派给会话变量来保存其值。

5.调用存储过程
sql 复制代码
CALL 存储过程名;
6.分隔符

MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错。所以要事先用 "DELIMITER //" 声明当前段分隔符,让编译器把两个 "//" 之间的内容当做存储过程的代码,不会执行这些代码。"DELIMITER ;" 的意为把分隔符还原。

3.MySQL存储过程的控制语句

1.条件语句

IF-THEN-ELSE语句:

sql 复制代码
IF 条件 THEN
    SQL语句;
END IF;
sql 复制代码
CREATE PROCEDURE methods()
BEGIN
  DECLARE a INT;
  SET a = 1;
  IF a = 1 THEN
    SELECT a;
  END IF;
END;

CALL methods();

CASE-WHEN-THEN-ELSE语句:

sql 复制代码
CASE 变量名
	WHEN 值1 THEN
		SQL语句;
  WHEN 值2 THEN
		SQL语句;
	ELSE
		SQL语句;
END CASE;
sql 复制代码
CREATE PROCEDURE methods()
BEGIN
  DECLARE a INT;
  SET a = 1;
  
  CASE a
	WHEN 0 THEN
		SELECT '0',a;
  WHEN 1 THEN
		SELECT '1',a;
	ELSE
		SELECT '---',a;
  END CASE;
  
END;

CALL methods();
2.循环语句

WHILE-DO...END-WHILE语句:

sql 复制代码
WHILE 条件 DO
  SQL语句;
END WHILE;
sql 复制代码
CREATE PROCEDURE methods()
BEGIN
  DECLARE a INT DEFAULT 0;
  WHILE a<5 DO
    INSERT INTO user (name,money) VALUES ('李明',1000);
    SET a=a+1;
  END WHILE;
END;

CALL methods();
相关推荐
Decay__23 分钟前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
小徐不徐说5 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
Decay__6 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
心梦缘-雪雁7 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk8 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW9 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
SelectDB9 小时前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
曼岛_9 小时前
[图解密码学]第4章 古典密码
java·数据库·密码学
瀚高PG实验室10 小时前
HGDB V9.0.5 .pgpass 免密登录提示 IsEncryptNon-base64 encoding 警告处理
数据库·postgresql·瀚高数据库