一、基本语法
1.创建存储过程
create procedure sp_name()2.删除存储过程
begin
.........
end
drop procedure sp_name//3.调用存储过程
call sp_name()需要注意:存储过程后面必须加上括号,不管有没有参数传递。
4.变量
自定义变量:
DECLARE i int; //定义为int类型
SET i = 0; //定义初始值为0
变量分为用户变量和系统变量,用户变量一般是以@开头,使用要谨慎,滥用十分不好管理。
CREATE PROCEDURE GetList()5.参数
BEGIN
SET @queqin = 'queqin';
SELECT @queqin FROM sc_kaoqin;
END
-- 调用存储过程
CALL GetList()
mysql存储过程的参数用在存储过程的定义,一共有三种参数类型。分别是in /out/inout。
<span style="font-family:KaiTi_GB2312;font-size:18px;">create procedure ( in | out |inout 参数名称 数据类型 )</span>in输入参数,表示该参数的值必须在调用存储过程中指定,在存储过程中修改该参数的值不能够被返回,为默认值。
out输入参数,该值可在存储过程内部被改变,并且可以返回。
inout 在调用时候改变,并且可以被改变和返回。
二、上手小例子
(1)简单选取字符串
-- 创建存储过程(2) 简单计算小例子
CREATE PROCEDURE hello()
SELECT 'World'
-- 调用存储过程
CALL hello();
这是我在网上找的一个小例子,觉得特别好,我也敲了一遍,分享给大家,上手十分容易。
CREATE PROCEDURE pr_add((3)存储过程+临时表实现考勤统计
-- 声明参数
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);
在项目的一个需求是,查询一段时间内考勤统计结果。因为逻辑比较复杂,所以我先计算每一天考勤统计,然后想实现循环叠加。所以需要传入时间参数和相应的查询条件,并且日期是不连续的,我是通过数组获取了考勤的日期。然后想通过传入日期计算机出来一段时间的考勤记录,通过一个临时表存储这些数据,最后一起取出来,然后删除临时表。所有就想到了存储过程,下面是部分重点代码。
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语句,特别不容易找出问题,一部分一部分的解决,各个击破。基础知识都是要学习的,不能够在放过自己,艰难前行的路上,收获更大。