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

相关推荐
xhbh66634 分钟前
MySQL数据导出避坑指南:如何选择正确的工具并设计安全的备份策略?
数据库·mysql·oracle·程序员·mysql导出数据库
幻奏岚音39 分钟前
《数据库系统概论》第一章 初识数据库
数据库·算法·oracle
蜗牛~turbo1 小时前
金蝶云星空 调价表取历史价格
java·数据库·sql·c#·database
jc06201 小时前
4.1-中间件之Redis
数据库·redis·中间件
Elastic 中国社区官方博客1 小时前
介绍 Python Elasticsearch Client 的 ES|QL 查询构建器
大数据·开发语言·数据库·python·elasticsearch·搜索引擎·全文检索
TG_yunshuguoji1 小时前
阿里云国际代理:云数据库RDS及上云方案
服务器·数据库·阿里云·云计算
FOLLOW ME3112 小时前
MySQL集群高可用架构
数据库·mysql·架构
TG_yunshuguoji2 小时前
阿里云国际代理:稳定、高效、便捷的数据库服务-云数据库RDS
运维·服务器·数据库·阿里云·云计算
·云扬·2 小时前
MySQL 日志全解析:Binlog/Redo/Undo 等 5 类关键日志的配置、作用与最佳实践
android·mysql·adb
danns8882 小时前
neo4j数据库创建范例(SQL文)
数据库·sql·neo4j