6.存储过程和函数-mysql

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/Yvken_Zh/article/details/80803154

存储过程和函数是在数据库中定义一些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;

对于存储过程和函数的用法,还是要多做练习才能熟练掌握用法,掌握基础语法,多找一些例题练习巩固一下最好。

猜你喜欢

转载自blog.csdn.net/Yvken_Zh/article/details/80803154