grade表:
select * from grade;
+----+------+--------+------+-------+-------+
| id | name | sexy | age | score | class |
+----+------+--------+------+-------+-------+
| 1 | a | male | 15 | 90 | A(1) |
| 2 | b | male | 13 | 97 | A(1) |
| 3 | c | female | 15 | 79 | A(2) |
| 4 | a | female | 13 | 100 | B(1) |
| 5 | d | male | 16 | 89 | B(2) |
| 6 | e | male | 16 | 97 | B(2) |
| 7 | f | female | 15 | 93 | B(3) |
| 8 | g | female | 13 | 88 | C(1) |
| 9 | h | male | 14 | 91 | C(2) |
+----+------+--------+------+-------+-------+
创建存储过程p_grade
delimiter &&
create procedure p_grade(in g_id int,out g_name varchar(20))
begin
declare g_score varchar(20);
select score into g_score from grade where id = g_id;
select name into g_name from grade where id = g_id;
select g_score;
end
&&
delimiter ;
call p_grade(1,@n);
+---------+
| g_score |
+---------+
| 90 |
+---------+
select @n;
+------+
| @n |
+------+
| a |
+------+
1.参数g_name的作用范围是begin...end之间
2.declare声明的变量作用范围是begin...end之间
3.declare必须在所有set前面,即使是变量g_name,也必须在所有declare之后赋值。
4.declare可以声明多个变量,但是多个变量的类型必须一致。
正确语法:declare a,b,c int default 10;
错误语法: declare a int,b int,c int;
5.sql语句中为了给g_score和g_name赋值,使用了两条select语句。简洁写法如下
select score,name into g_score,g_name from grade where id = g_id;
创建存储函数f_grade
delimiter &&
create function f_grade(g_id int)
returns varchar(20)
begin
declare g_name varchar(20) default '';
select name into g_name from grade where id = g_id;
return g_name;
end
&&
delimiter ;
select f_grade(1);
+------------+
| f_grade(1) |
+------------+
| a |
+------------+
1.存储函数的参数列表没有In,out或者inout关键字,所有参数都为输入参数
2.必须有返回值
returns 返回类型
这和高级编程语言函数返回空值void是有区别的
返回类型后面不能有分号,分号只能出现在begin...end之间
3.begin...end之间必须有return ***。一般放在end之前,理由同高级编程语言函数中return的位置
4.存储函数bein...end之间不能有select输出
创建存储过程p_grade3
delimiter && create procedure p_grade3(in c_score int) comment 'index g_score' begin declare cmp tinyint; declare count int; declare g_score int; declare cur_score cursor for select score from grade; select count(*) into count from grade; open cur_score; while count > 0 do fetch cur_score into g_score; select g_score; insert into test (score) values (g_score); set count = count - 1; end while; close cur_score; end && delimiter ;
存储过程中循环输出了游标里面的所有记录
定义条件和处理程序
delimiter &&
create procedure p_grade2()
begin
declare duplicate_entry condition for sqlstate '23000';
declare continue handler for duplicate_entry set @message = 'duplicate_entry';
set @count = 1;
insert into grade (id) values (9);
set @count = @count + 1;
end
&&
delimiter ;
1.grade表id字段是自增主键,不允许重复插入相同值
2.sqlstate或者mysql_error_code可以通过事先insert into grade (id) values (9);根据控制台的错误信息得到
ERROR 1062 (23000): Duplicate entry '9' for key 'PRIMARY'
3.处理程序中
set @message = 'duplicate_entry'
该段语句是发生错误时的处理代码,必须和handler for在同一行
4.在执行
insert into grade (id) values (9);
如果没有发生错误,那么继续执行后面的set @count = @count + 1;
如果发生了错误,由于处理程序的handle_type是continue,那么仍然继续执行后续语句,当前插入失败,并且处理程序的处理语句 set @message = 'duplicate_entry'被执行;