存储过程和函数是在数据库中定义一些SQL语句的集合。然后需要哪些功能的时候,直接掉用存储过程和函数来执行已经定义好了的SQL语句,引入存储过程和函数可以减少开发人员编写重复的SQL。
存储过程和函数是在MYSQL的服务器中存储执行的,这个SQL语句是已经编译过了的,可以减少了客户端服务端数据传输。
存储过程
存储过程的关键词是 PROCEDURE ,和函数有些类似,也有参数
还是以这个t_book表为例,这里创建的存储过程功能是,得到某个类别下图书的数量
sql语句就是,这个bt是输入的参数 在调用存储过程的时候输入的参数
SELECT COUNT(*) from t_book where bookTypeId=bT;
存储过程如下
delimiter &&
CREATE PROCEDURE pro_book(IN bT INT, OUT count_num INT)
READS SQL DATA
BEGIN
SELECT COUNT(*) from t_book where bookTypeId=bT;
END
&&
delimiter;
调用存储过程是用call
call pro_book(1, @a);
select @a;
得到的字段是图书类别为1的图书数量
函数
mysql的函数和高级语言的函数语法差不多,有带参数,也有return
看一个简单的函数,按照id查询对应的图书名称
delimiter &&
CREATE FUNCTION fun_book(bookId INT)
RETURNS VARCHAR(20)
BEGIN
RETURN (SELECT bookName from t_book WHERE id = bookId);
END
&&
delimiter;
调用函数 直接select就可以得到信息了
SELECT fun_book(2);
关于存储过程和函数里面的用法还有很多,也有if,while循环等操作。结合实际的例子再说
1、申请变量Declear和赋值set
这个创建存储过程的代码,申请三个变量 并说明数据类型,使用set赋值,然后插入到表里面去
//使用set给变量赋值
delimiter &&
CREATE PROCEDURE pro_user2()
BEGIN
DECLARE a VARCHAR(20);
DECLARE b DECIMAL(5,2);
DECLARE c INT;
SET a = '计算机网络', b = 34.5, c = 7;
INSERT INTO t_book VALUES(NULL, a,b, c);
END
&&
delimiter;
然后直接调用该过程call pro_user2();
就完成一次数据的插入
这是申请变量和给变量赋值的用法。
2、游标的使用
游标有点想迭代器,一次可以指向一个表里面的一行,配合循环使用的话,可以将一个表里多条数据插入到另一个表里面去。
从一个表中读取多条数据插入到另一个表中去,配合循环一起使用
delimiter &&
CREATE PROCEDURE pro_user4()
BEGIN
DECLARE a,b VARCHAR(20);
DECLARE done INT DEFAULT FALSE;
DECLARE cur_t_user2 CURSOR FOR SELECT userName2,password2 from t_user2;
OPEN cur_t_user2;
read_loop:LOOP
FETCH cur_t_user2 INTO a,b;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO t_user VALUES(NULL,a,b);
END LOOP;
CLOSE cur_t_user2;
END
&&
delimiter;
没调用存储过程之前两个表分别是这样子:
call pro_user4();之后就应该把第二张表的所有数据插入到第一张表中去
可以理解成一个迭代器,有点相像。
3、循环,if分支的使用
这里的循环和if的判断和程序设计语言语法是差不多的
看一个if的用法例子 ,调用的时候需要传一个参数,如果存在这样id的记录,就修改,如果不存在 就插入一条新的数据
//条件判断
delimiter &&
CREATE PROCEDURE pro_user5(IN bookId INT)
BEGIN
SELECT COUNT(*) INTO @num from t_user WHERE id = bookId;
IF @num > 0 THEN UPDATE t_user SET userName = '劳资更新' WHERE id = bookId;
ELSE
INSERT INTO t_user VALUES(null, '插入数据','hhhhh');
END IF;
END
&&
delimiter;
两个测试:
case的用法,也是属于选择判断分支,类似switch case语句
//case 判断
delimiter &&
CREATE PROCEDURE pro_user6(IN bookId INT)
BEGIN
SELECT COUNT(*) INTO @num from t_user WHERE id = bookId;
CASE @num
WHEN 1 THEN UPDATE t_user SET userName = 'case 更新' WHERE id = bookId;
when 2 THEN INSERT INTO t_user VALUES(null, 'case 插入','case hhhh');
ELSE INSERT INTO t_user VALUES(null, 'else case 插入', 'else hhhh');
END CASE;
END
&&
delimiter;
while循环的用法
传入一个参数 n,给一个表里面插入n条记录
//while循环语句 有着一个循环就够用了
delimiter &&
CREATE PROCEDURE pro_user10(IN totalNum INT)
BEGIN
WHILE totalNum > 0 DO
INSERT INTO t_user VALUES(totalNum, '2346353', 'hhhhhhh');
SET totalNum = totalNum - 1;
END WHILE;
END
&&
delimiter;
对于存储过程和函数的用法,还是要多做练习才能熟练掌握用法,掌握基础语法,多找一些例题练习巩固一下最好。