mysql存储过程教学_MySQL存储过程快速入门教程

本文是MySQL存储过程的快速入门教程,涵盖了CREATE PROCEDURE语法、IN/OUT/INOUT参数类型,以及单行和多行注释的使用。通过实例演示了如何使用IN、OUT和INOUT参数,并讲解了SQL中的变量赋值、条件语句(IF-ELSE、CASE)、循环语句(WHILE、REPEAT)以及游标的定义和使用。此外,还提到了游标循环中的注意事项和嵌套使用。
摘要由CSDN通过智能技术生成

快速教程包括以下部分:

CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体

DELIMITER //

CREATE PROCEDURE myproc(IN s int)

BEGIN

#定义变量

DECLARE @item_id long;

#业务逻辑写在这里

END

//

DELIMITER ;

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

#存储过程IN参数

DELIMITER //

CREATE PROCEDURE in_param(IN p_in int)

BEGIN

SELECT p_in;

SET p_in=2;

SELECT p_in;

END;

//

DELIMITER ;

#调用

SET @p_in=1;

CALL test1(@p_in);

SELECT @p_in;

MySQL Workbence 执行结果:

21ecefa1bf4352b25b6c293a151ca1ed.png

84c3eaabf56529a1a28dc84680d5ccc4.png

f72487f2dffe0a5e29cac268b5a594dd.png

OUT:该值可在存储过程内部被改变,并可返回

#存储过程OUT参数

DELIMITER //

CREATE PROCEDUREtest2(OUT p_out int)

BEGIN

SELECT p_out;

SET p_out=2;

SELECT p_out;

END;

//

DELIMITER ;

#调用

SET @p_out=1;

CALLtest2(@p_out);

SELECT @p_out;

执行结果:

2965f2894ea5cf472bf05151ca7847e8.png

34a25aad12a64729ed1786a657acca87.png

212a1aa5136a06a523c8302c2d5ea9e7.png

INOUT:调用时指定,并且可被改变和返回

#存储过程INOUT参数

DELIMITER //

CREATE PROCEDURE test3(INOUT p_inout int)

BEGIN

SELECT p_inout;

SET p_inout=2;

SELECT p_inout;

END;

//

DELIMITER ;

#调用

SET @p_inout=1;

CALL test3(@p_inout) ;

SELECT @p_inout;

执行结果:

243d128e268001758a2f3eefd45b1130.png

eef0769ba3551f5e13be172b9bbe5d30.png

eef0769ba3551f5e13be172b9bbe5d30.png

单行:#存储过程单行注释

多行注释:

/**

这里是存储过程多行注释

**/

SQL中给变量赋值

方式 1:

DECLARE cnt INT DEFAULT 0;

select count(*) into cnt from test_tbl;

select cnt;

方式 2:

set @cnt = (select count(*) from test_tbl);

select @cnt;

方式 3:

select count(*) into @cnt1 from test_tbl;

select @cnt1;

多个列的情况下似乎只能用 into 方式

select max(status), avg(status) into @max, @avg from test_tbl;

select @max, @avg;

条件语句

if true then

#业务代码

elseif true then

#业务代码

else

#业务代码

end if;

------------------------------------------

CASE var

WHEN 0 THEN

#业务代码

WHEN 1 THEN

#业务代码

ELSE

#业务代码

END CASE ;

循环语句

WHILE-DO…END-WHILE

WHILE trueDO

#业务代码

END WHILE ;

REPEAT...END REPEAT,先执行操作后检查结果

SET v=0;

REPEAT

INSERT INTO t VALUES(v);

SET v=v+1;

UNTIL v>=5

END REPEAT;

一般来说这2中循环基本够用,其他循环参考https://www.cnblogs.com/mark-chan/p/5384139.html

游标循环和遍历

游标的定义和使用同一般编程语言的逻辑相似,先定义后使用,使用完成后关闭。但是第一次使用中按照程序编写容易出现Mysql游标总是多循环一次,注意下图中的第15和24行。

f79ca4b15ef8f814a000792d666ae524.png

注意:使用fetch into时,变量的定义不要和你的select的列的键同名!不然,fetch into 会失败!

多个游标循环嵌套

跟一般的代码一样,会遇到多层循环嵌套,且第2层循环还要使用第一层循环的数据。CREATE PROCEDURE test4 ()

BEGIN

#定义

#遍历数据结束标志

DECLARE done INT DEFAULT FALSE;

#定义游标

DECLARE mycur CURSOR FOR SELECT id, name FROM t;

#将结束标志绑定到游标

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

#使用游标

#打开游标

OPEN mycur;

FETCH mycur into item_id, item_name;

#开始循环

WHILE done do

#第2层游标

BEGIN

DECLARE second_done boolean DEFAULT true;

#item_id为第1层循环传递的变量

DECLARE mycur_2 CURSOR FOR SELECT price, quantity FROM t2 where id=item_id;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET second_done = TRUE;

OPEN mycur_2;

FETCH mycur_2 into item_id, item_name;

WHILE done do

#第2层游标业务处理代码

FETCH mycur_2 into item_id, item_name;

END WHILE;

CLOSE mycur_2;

END;

FETCH mycur into item_id, item_name;

END WHILE;

#关闭游标

CLOSE mycur;

END;

1. 返回结果集使用select.

返回一个变量的值:select 变量名; 。

返回一张表数据:select * from t;。

2. 调用存储过程

call 存储过程名 (参数1, 参数2);

。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值