1.入门实例
-- 删除
drop PROCEDURE if EXISTS test1;
-- 创建
CREATE PROCEDURE test1 (IN emp_id INT)
READS SQL DATA
BEGIN
SELECT *, COUNT(*)
FROM user
WHERE id= emp_id ;
END
;
-- 执行
call test2(1);
DROP PROCEDURE IF EXISTS test2;
CREATE PROCEDURE test2()
BEGIN
-- 需要定义接收游标数据的变量
DECLARE done INT DEFAULT FALSE;
DECLARE tmp_id INT DEFAULT 0;
DECLARE tmp_name VARCHAR(255) DEFAULT 0;
DECLARE tmp_passsword VARCHAR(255);
-- 游标
DECLARE t_index CURSOR FOR SELECT id, name, password FROM user;
-- 将结束标志绑定到游标
-- 写法一:DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 写法二:DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
-- 打开游标
OPEN t_index;
REPEAT
FETCH t_index INTO tmp_id,tmp_name,tmp_passsword;
IF done!=1 THEN
-- 测试获取数据,
IF tmp_name='a' THEN
SELECT tmp_id,tmp_name,tmp_passsword;
END IF;
-- 测试插入数据数据,
-- insert into user VALUES (null,tmp_name,tmp_passsword);
END IF;
UNTIL DONE END REPEAT;
-- 关闭游标
CLOSE t_index;
END;
call test2();
2.限制参数
mysql创建存储过程的时候发现有这么四个数据存取限制的参数,
CONTAINS SQL表示子程序不包含读或写数据的语句。
NO SQL表示子程序不包含SQL语句。
READS SQL DATA表示子程序包含读数据的语句,但不包含写数据的语句。
MODIFIES SQL DATA表示子程序包含写数据的语句。
如果这些特征没有明确给定,默认的是CONTAINS SQL。