sql语句那些事儿—mysql 又见存储过程

时间:2022-01-02 01:02:40
    这几天在做项目的过程中,小编遇到一个问题,需要创建存储过程和临时表。还记得在牛腩的时候,敲过存储过程,到后面使用的就比较少,所以这次机会,又重新学习了一下mysql存储过程的知识。
 一、基本语法

 1.创建存储过程

create procedure sp_name()
begin
.........
end
2.删除存储过程

drop procedure sp_name//
3.调用存储过程

call sp_name()
需要注意:存储过程后面必须加上括号,不管有没有参数传递。

4.变量

自定义变量:

 DECLARE i int; //定义为int类型
SET i = 0; //定义初始值为0


变量分为用户变量和系统变量,用户变量一般是以@开头,使用要谨慎,滥用十分不好管理。

CREATE PROCEDURE GetList()
BEGIN

SET @queqin = 'queqin';
SELECT @queqin FROM sc_kaoqin;
END
-- 调用存储过程
CALL GetList()
5.参数

mysql存储过程的参数用在存储过程的定义,一共有三种参数类型。分别是in /out/inout。

<span style="font-family:KaiTi_GB2312;font-size:18px;">create procedure ( in | out |inout 参数名称 数据类型 )</span>
in输入参数,表示该参数的值必须在调用存储过程中指定,在存储过程中修改该参数的值不能够被返回,为默认值。

out输入参数,该值可在存储过程内部被改变,并且可以返回。

inout 在调用时候改变,并且可以被改变和返回。

二、上手小例子

(1)简单选取字符串

-- 创建存储过程
CREATE PROCEDURE hello()
SELECT 'World'
-- 调用存储过程
CALL hello();
(2) 简单计算小例子

 这是我在网上找的一个小例子,觉得特别好,我也敲了一遍,分享给大家,上手十分容易。

CREATE PROCEDURE pr_add(
-- 声明参数
a int,
b int
)
BEGIN
-- 定义变量
DECLARE c int;

IF a is null THEN
SET a = 0;
end if ;
if b is null then
set b = 0;
end if ;
SET c = a+b;
-- 选取结果
select c as sum ;

END;
-- 执行存储过程
CALL pr_add(10,20);
(3)存储过程+临时表实现考勤统计

在项目的一个需求是,查询一段时间内考勤统计结果。因为逻辑比较复杂,所以我先计算每一天考勤统计,然后想实现循环叠加。所以需要传入时间参数和相应的查询条件,并且日期是不连续的,我是通过数组获取了考勤的日期。然后想通过传入日期计算机出来一段时间的考勤记录,通过一个临时表存储这些数据,最后一起取出来,然后删除临时表。所有就想到了存储过程,下面是部分重点代码。

CREATE PROCEDURE temp11(
dateList VARCHAR (200)
-- strWhere VARCHAR (200)
)
-- 声明变量
BEGIN
DECLARE i int;
SET i = 0;
--1. 创建临时表
CREATE TEMPORARY TABLE IF NOT EXISTS temp9 (
classno VARCHAR (200), queqin VARCHAR (200), qingjia VARCHAR (200), jibu VARCHAR (300))
-- 2. 循环插入临时表
WHILE i <= 4 DO
INSERT INTO temp9 (SELECT * from sc_kaoqin);
SET i = i+1;
end WHILE;
-- 3.返回 数据库所有数据
SELECT * from temp9 ;</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">drop temp9END-- 执行存储过程 CALL temp9('5');
三、意外的收获


mysql中同样支持循环语句,3种常用的循环方法:while循环、loop循环和repeat循环。

标准格式如下:(1)While...DO...end while (2) Loop ...End loop (3)Repeat ...Until end repeat

begin
declare i int;          // 变量声明
set i = 1;     
while i < 11 do           // 循环体
insert into user_profile (uid) values (i);
set i = i +1;
end while;
虽然以前学过,这次算是比较熟练的实践吧。 (未完待续)

小结:

  测试sql的时候,可以一部分一部分的测试,几十行的sql语句,特别不容易找出问题,一部分一部分的解决,各个击破。基础知识都是要学习的,不能够在放过自己,艰难前行的路上,收获更大。