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

相关推荐
Think Spatial 空间思维15 分钟前
【HTTPS基础概念与原理】TLS握手过程详解
数据库·网络协议·https
逝水如流年轻往返染尘23 分钟前
MySQL表的增删查改
mysql
laowangpython35 分钟前
MySQL基础面试通关秘籍(附高频考点解析)
数据库·mysql·其他·面试
mooyuan天天1 小时前
SQL注入报错“Illegal mix of collations for operation ‘UNION‘”解决办法
数据库·web安全·sql注入·dvwa靶场·sql报错
运维-大白同学1 小时前
go-数据库基本操作
开发语言·数据库·golang
R-sz1 小时前
通过从数据库加载MinIO配置并初始化MinioClient,spring boot之Minio上传
数据库·oracle
洛阳泰山2 小时前
Windows系统部署MongoDB数据库图文教程
数据库·windows·mongodb
医只鸡腿子2 小时前
3.2/Q2,Charls最新文章解读
数据库·数据挖掘·数据分析·深度优先·数据库开发
bang___bang_2 小时前
PostgreSQL内幕剖析——结构与架构
数据库·postgresql
龙俊亨3 小时前
达梦数据库查看各数据库表内容
数据库