案例1(变量及其特点和应用)
通过存储过程获取id为2的表数据
DELIMITER $$
CREATE PROCEDURE test1()
BEGIN
-- 声明变量,一个declare只能声明一个遍历
DECLARE NAME VARCHAR(32) DEFAULT '';
-- 1、可以直接赋值
-- set name = 'hahaha';
-- 2、可以通过查询将结果集赋值
SELECT mark_name INTO NAME FROM book_mark WHERE id = 2;
-- 返回值
SELECT NAME;
END;
$$
DELIMITER ;
总结
1.变量的声明需要用declare,一个declare只能声明一个变量,变量必须先声明后使用
2.变量具有数据类型和长度,与mysql中数据类型保持一致,甚至可以指定默认值、字符集和排序规则等
3.变量可以通过set来赋值,也可以通过select into的方式赋值
4.变量需要返回,可以使用select语句,如:select 变量名
案例2(测试变量的作用域):
统计表book_mark和表user的行数量,以及book_mark最小最大ID的数据记录
DELIMITER $$
CREATE PROCEDURE maxiaojun()
BEGIN
DECLARE book_count INT DEFAULT 0;
DECLARE user_count INT DEFAULT 0;
-- 使用两个代码块,测试变量的作用范围,可以发现声明的变量只在当前begin-end作用域有效
BEGIN
SELECT COUNT(1) INTO book_count FROM book_mark;
SELECT COUNT(1) INTO user_count FROM USER;
SELECT book_count, user_count;
END;
BEGIN
DECLARE min_id BIGINT(11) DEFAULT 0;
DECLARE max_id BIGINT(11) DEFAULT 0;
SELECT MIN(id),MAX(id) INTO min_id, max_id FROM book_mark;
SELECT min_id, max_id,book_count,user_count;
END;
END;
$$
DELIMITER ;
总结
1.变量是有作用域的,作用范围在声明此变量的begin和end之间,end结束变量的作用范围也随之结束
2.需要多个块之间传递值,可以使用全局变量,即放在所有代码块之前
3.传参变量是全局的,可以在多个块之间起作用