MySQL:存储过程

1. 含义

一组预先编译好的SQL语句的集合

2. 好处

提高代码的重用性
简化操作
减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

3. 语法

创建

CREATE PROCEDURE 存储过程名 (参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END

注意:

  1. 参数列表包含三部分:参数模式 参数名 参数类型( 例:IN stuname VARCHAR(20)
  2. 参数模式有三种:
  • IN:该参数可以作为输入,也就是说该参数需要调用方传入值
  • OUT:该参数可以作为输出,也就是该参数可以作为返回值
  • INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
  1. 如果存储过程体只有一条语句,则BEGIN和END可以省略
  2. 存储过程体中的每条SQL语句的结尾要求必须加分号,存储过程的结尾可以使用 DELIMITER 重新设置,例:DELIMITER $

调用

CALL 存储过程名 (实参列表) ;

4. 实例(使用命令行)

空参列表

  • 插入到admin表中五条记录
-- 创建,将语句的结束标记改成$
DELIMITER $ 
CREATE PROCEDURE myp1 () 
BEGIN

INSERT INTO `admin` (`username`, `password`) 
VALUES
  ('费渡', '1234'),
  ('简隋英', '1234'),
  ('李玉', '1234'),
  ('骆闻舟', '1234'),
  ('赵锦辛', '1234') ;

END $
-- 调用
CALL myp1 () $
-- 查看
select * from admin $

带IN模式参数的存储过程

  • 根据女神名去查询对应的男神信息
-- 创建
CREATE PROCEDURE myp2 (IN beauty_name VARCHAR (20)) 
BEGIN

SELECT 
  bo.* 
FROM
  `beauty` AS b 
  RIGHT JOIN `boys` AS bo 
    ON b.`boyfriend_id` = bo.`id` 
WHERE b.`name` = beauty_name ;

END $
-- 调用
CALL myp2 ('费渡') $
  • 判断用户是否登录成功
-- 创建
CREATE PROCEDURE myp3 (
  IN username VARCHAR (10),
  IN `password` VARCHAR (10)
) 
BEGIN

DECLARE nums INT ;
    
SELECT 
  COUNT(*) INTO nums 
FROM
  `admin` AS a 
WHERE a.`username` = username 
  AND a.`password` = `password` ;

SELECT 
  IF (
    nums = 1,
    "登录成功",
    "登录失败"
  ) AS result ;

END $ 
-- 调用
CALL myp3 ('费渡', '1234') $ 

带OUT模式的存储过程

  • 根据女神名,返回对应的男神名
-- 创建
CREATE PROCEDURE myp4 (
  IN beauty_name VARCHAR (50),
  OUT boy_name VARCHAR (20)
) 
BEGIN  

SELECT 
  bo.`boyName` INTO boy_name
FROM
  `beauty` AS b 
  RIGHT JOIN `boys` AS bo 
    ON b.`boyfriend_id` = bo.`id` 
WHERE b.`name` = beauty_name ;

END $ 
-- 调用
CALL myp4 ('费渡', @name) $ 
SELECT 
  @name $  
  • 根据根据女神名,返回对应的男神名和魅力值
-- 创建
CREATE PROCEDURE myp5 (
  IN beauty_name VARCHAR (50),
  OUT boy_name VARCHAR (20),
  OUT user_cp INT
) 
BEGIN  

SELECT 
  bo.`boyName`,
  bo.`userCP` INTO boy_name,
  user_cp 
FROM
  `beauty` AS b 
  RIGHT JOIN `boys` AS bo 
    ON b.`boyfriend_id` = bo.`id` 
WHERE b.`name` = beauty_name ;

END $ 
-- 调用
CALL myp5 ('费渡', @name, @`value`) $ 
SELECT 
  @name,
  @`value` $ 

带INOUT模式参数的存储过程

  • 传入两个值,得到两个值的二倍
-- 创建
CREATE PROCEDURE myp6 (INOUT a INT, INOUT b INT) 
BEGIN

SET a = a * 2 ;
SET b = b * 2 ;
 
END $ 
-- 调用
SET @a = 3 $
SET @b = 4 $
CALL myp6 (@a, @b) $
SELECT 
  @a,
  @b $ 

5. 其他操作

删除存储过程

-- 不支持一次删除多个
DROP PROCEDURE myp1 ;

查看存储过程的信息

SHOW CREATE PROCEDURE myp2 ;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359