MySQL存储过程和函数-完整例子

#示例数据:
CREATE TABLE sch ( id INT, NAME VARCHAR ( 50 ), glass VARCHAR ( 50 ) );
INSERT INTO sch 
VALUE
	( 1, 'xiaoming', 'glass 1' ),
	( 2, 'xiaojun', 'glass 2' );

#结果如下:
 DESC sch;
+-------+-----------------+------+-------+---------+-------+
| Field | Type        | Null | Key  | Default | Extra |
+-------+-----------------+------+-------+---------+-------+
| id    | int(11)      | YES |      | NULL |      |
| name  | varchar(50)  | YES |     | NULL |      |
| glass  | varchar(50)  | YES |     | NULL |      |
+--------+----------------+------+-------+---------+-------+

#SELECT * FROM sch 查看表格内容:
+------+------------+-----------+
| id   | name    | glass   |
+------+------------+-----------+
|    1 | xiaoming | glass 1  |
|    2 | xiaojun  | glass 2  |
+------+------------+-----------+

#创建统计表格内记录条数的存储函数:count_sch()
 DELIMITER //
 CREATE FUNCTION count_sch()
     RETURNS INT
     RETURN (SELECT COUNT(*) FROM sch);
     //
 DELIMITER;
 
SELECT count_sch() 
+-------------+
| count_sch() |
+-------------+
|      2   |
+-------------+

#创建一个存储过程,通过调用存储函数,获取表sch中的记录数和sch表中id的和。
#这个存储过程的代码中使用到了变量的声明、光标、流程控制、在存储过程中调用存储函数等,是两条记录,id之和为3,记录条数是通过上面的存储函数count_sch()获取的,是在存储过程中调用了存储函数:
 DELIMITER //
 CREATE PROCEDURE add_id(out count INT)
     BEGIN
     DECLARE itmp INT;
     #定义一个光标:cur_id
     DECLARE cur_id CURSOR FOR SELECT id FROM sch;
     #定义一个处理程序,当该存储过程报NOT FOUND的错误时,执行退出,关闭光标
     DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_id;
     #调用预先写好的存储函数,将结果赋给输出变量:count
     SELECT count_sch() INTO count;
     SET @sum=0;
     #打开光标:cur_id
     OPEN cur_id;
     #循环
     REPEAT
     #将光标cur_id的值放入itmp中,当表中数据读取完毕后,会报出NOT FOUND错误。
     FETCH cur_id INTO itmp;
     IF itmp<10
     THEN SET  @sum=  @sum+itmp;
     END IF;
     #设置无限循环
     UNTIL 0 END REPEAT;
     CLOSE cur_id;
     END //
 DELIMITER ;

# 调用存储过程
# 注意存储过程调用时的“变量”的写法
CALL add_id ( @a );

#查看变量
SELECT
	@a,
	@sum;
+------+--------+
| @a  | @sum |
+------+--------+
|    2 |    3 |
+------+-------+

发布了78 篇原创文章 · 获赞 59 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yuhezheg/article/details/104113401