MySQL存储过程

存储过程定义:是一组为了完成特定功能的sql语句的集合 类似于函数 写好了一个存储过程之后 可以像函数一样随时调用SQL语句的集合 主要用在复杂的 需要很多sql语句联合执行完成的任务

存储过程在执行上比sql语句的速度快 效率也更高

#先建一张表

CREATE TABLE info(

id INT PRIMARY KEY,

name VARCHAR(12),

score DECIMAL(5,2),

pass VARCHAR(12)

);

#创建存储过程 delimiter $$:将语句的结束符号从分号 临时改变成两个$$

delimiter $$

CREATE PROCEDURE proc ()

BEGIN

SELECT * FROM info;

END $$

delimiter;

#proc 不能重复在当前库唯一

#begin 过程体开始的关键字 后面跟需要执行的SQL语句

#end$$ 表示存储过程中所有语句结束 和上面的定义开始符号一一对应

#delimiter 将结束语句的分号恢复 作用就是保证整个存储过程中的SQL语句能够完整执行

#查看库中所有存储过程:

SHOW PROCEDURE STATUS WHERE db='kgc';

SHOW PROCEDURE STATUS LIKE '%proc';

#调用存储过程

CALL proc;

#删除存储过程

DROP PROCEDURE IF EXISTS test1;

#存储过程中有三种运用的方式

#1、in 输入参数 调用者向存储过程传入值

#2、out 输出参数 表示存储过程像调用者传输值 可以返回多个值

#3、inout 表示调用者先向存储过程传入值 存储过程对传入值可能进行额外的操作之后再返回给调用者

#给存储过程传参

delimiter $$

CREATE PROCEDURE test1 (in uname char(20))

BEGIN

SELECT * FROM info WHERE name='uname';

SELECT * FROM info;

UPDATE info SET name='李四' WHERE name=uname;

end $$

delimiter;

CALL test1('张三');

#数据清洗和指定数据入库 分析用户行为

#传出参数

delimiter $$

CREATE PROCEDURE test2(OUT num INT)

BEGIN

SET num = 100;

END $$

delimiter;

CALL test2(@num);

INSERT INTO info VALUES(2,'张三',@num,'否');

#输入和输出参数

delimiter $$

CREATE PROCEDURE test3(inout str VARCHAR(10))

BEGIN

SELECT str; -- 显示输入字符

SET str = CONCAT(str, '_ky32');-- 让传入的字符串做拼接

SELECT str; -- 加工之后的字符串

END $$

delimiter;

SET @str='麻子';

CALL test3(@str);

UPDATE info SET name=@str WHERE id = 1;

in :先传入 定义变量的值 初始值

call test3 调用存储过程 把变量的值传入存储过程

#存储过程中控制语句

delimiter $$

CREATE PROCEDURE test4 (in num INT)

BEGIN

if num>=10 THEN

SET num=num-6;

ELSE

SET num =num*2;

END IF;-- 结束if语句判断

SELECT num;

END $$

delimiter;

SET @num = 19;

CALL test4 (@num);

UPDATE info SET id = @num WHERE score = 100;

#调用多个参数 范围的方式匹配 完成传参

delimiter $$

CREATE PROCEDURE test5 (INOUT score INT,OUT grade VARCHAR(15))

BEGIN

IF score BETWEEN 85 AND 100 THEN

SET grade = '优秀';

ELSEIF score BETWEEN 60 AND 84 THEN

SET grade = '一般';

ELSE

SET grade = '不及格';

END IF;

SELECT grade;

END $$

delimiter;

SET @score =55;

CALL test5(@score,@grade);

UPDATE info SET score=@score,pass=@grade WHERE id = 19;

#WHILE循环语句

delimiter $$

CREATE PROCEDURE test7 (OUT result INT)

BEGIN

DECLARE a INT;-- 在过程体中声明变量

DECLARE i INT;

SET a = 10;

SET i = 1;

WHILE i <=10 DO

SET a = a+10;

SET i = i+1;

END WHILE;

SET result = a;

END $$

delimiter;

SET @result=110;

CALL test7(@result);

SELECT @result;

使用存储过程中 在内部变量不需要加@ 外部调用时需要加@引用变量

在存储过程begin之后声明变量要用declare 声明变量要加数据类型

要使用存储过程里面的结果必须要 out才能传出参数 在声明存储变量时 要定义好参数的传参方式inout

相关推荐
朝九晚五ฺ9 分钟前
【MySQL基础】MySQL事务详解:原理、特性与实战应用
数据库·mysql
唐大爹29 分钟前
my2sql-binlog闪回测试
mysql·my2sql·binlog闪回
切糕师学AI37 分钟前
SQL中对字符串字段模糊查询(LIKE)的索引命中情况
数据库·sql
Dontla38 分钟前
Postgres介绍(PostgreSQL)(开源对象关系型数据库管理系统)(与Mysql对比)
数据库·postgresql·开源
爬山算法1 小时前
MySQL(140)如何解决外键约束冲突?
数据库·mysql
云边散步2 小时前
🧱 第1篇:什么是SQL?数据库是啥?我能吃吗?
数据库·sql
AWS官方合作商2 小时前
如何连接 AWS RDS 数据库实例
数据库·云计算·aws
都叫我大帅哥2 小时前
MySQL的B+Tree索引:从原理到实战的全面指南
mysql
InnovatorX2 小时前
MySQL 备份与恢复指南
数据库·mysql
DIY机器人工房2 小时前
关于LVGL中文输入法的设置步骤:
服务器·前端·数据库·stm32·嵌入式硬件·嵌入式·diy机器人工房