存储过程和存储函数

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'被执行;

 

 

 

  

 

转载于:https://www.cnblogs.com/bibiafa/p/9328282.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值