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

    这几天在做项目的过程中,小编遇到一个问题,需要创建存储过程和临时表。还记得在牛腩的时候,敲过存储过程,到后面使用的就比较少,所以这次机会,又重新学习了一下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 temp9
END

-- 执行存储过程
 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语句,特别不容易找出问题,一部分一部分的解决,各个击破。基础知识都是要学习的,不能够在放过自己,艰难前行的路上,收获更大。


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值