#示例数据:
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 |
+------+-------+
MySQL存储过程和函数-完整例子
猜你喜欢
转载自blog.csdn.net/yuhezheg/article/details/104113401
今日推荐
周排行