存储过程和函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存储过程和函数相关的知识,希望对你有一定的参考价值。
存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复编写相同的SQL语句。而且,存储过程和函数是在mysql服务器中存储和执行的,可以减少客户端和服务器端的数据传输。
- 创建存储过程
- 创建存储函数
- 变量的使用
- 定义条件和处理程序
- 光标的使用
- 流程控制的使用
- 调用存储过程和函数
- 查看存储过程和函数
- 修改存储过程和函数
- 删除存储过程和函数
14.1 创建存储过程和函数
创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中,例如,银行经常需要计算用户的利息。不同类别的服务的利息是不一样的。这就可以将计算利率的SQL代码写成一个存储过程或者存储函数。只要调用这个存储过程或者存储函数,就可以将不同类别用户的利息计算出来。
14.1.1 创建存储过程
CREATE PROCEDURE sp_name
([proc_parameter[,...]])
[characteristic ...] routine_body
[IN|OUT|INOUT] param_name type
输入|输出|输入输出 存储过程参数名称 存储过程的参数类型
DELIMITER &&
CREATE PROCEDURE num_from_employee (IN emp_id INT, OUT count_num INT)
READS SQL DATA
BEGIN
SELECT COUNT(*) INTO count_num
FROM employee
WHERE d_id=emp_id;
END
&&
DELIMITER ;
14.1.2 创建存储函数
MySQL中,创建存储函数的基本形式如下:
CREATE FUNCTION sp_name([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
delimiter &&
create function name_from_employee (emp_id int)
returns varchar(20)
begin
return (select name from employee where d_id=emp_id);
end
&&
delimiter ;
14.1.3 变量的使用
存储过程和函数中可以定义和使用变量。用户可以使用DECLARE关键字来定义变量。然后可以为变量赋值。这些变量的作用范围是BEGIN...END程序段中。
1 定义变量
2 为变量赋值
# 定义变量my_sql, 数据类型为int型,默认值为10。
DECLARE my_sql INT default 10;
# 变量赋值
set my_sql=30;
select d_id into my_sql from employee where id=2;
14.1.4 定义条件和处理程序
定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。
1. 定义条件
2. 定义处理程序
DECLARE condition_name CONDITION FOR condition_value
condition_value;
sqlstate [value] sqlstate_value | mysql_error_code
"ERROR 1146(42S02)"这个错误,名称为can_not_find。可以用两种不同的方法来定义。
# 方法一:使用sqlstate_value
DECLARE can_not_find CONDITION FOR SQLSTATE ‘42S02‘;
# 方法二:使用mysql_error_code
DECLARE can_not_find CONDITION FOR 1146;
# 定义处理程序
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type
CONTINUEW|EXIT|UNDO
condition_value
SQLSTATE[VALUE]sqlstate_value|condition_name|SQLWARNING
|NOT FOUND|SQLEXCEPTION |mysql_error_code
# 方法一:捕获sqlsate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘42S02‘ SET @info=‘CAN NOT FIND‘;
# 方法二:捕获mysql_error_code
DECLARE CONTINUE HANDLER FOR 1146 SET @info=‘CAN NOT FIND‘;
# 方法三:先定义条件,然后调用
DECLARE can_not_find CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR can_not_find SET @info=‘CAN NOT FIND‘;
# 方法四:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING SET @info=‘ERROR‘;
# 方法五:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info=‘CAN NOT FIND‘;
# 方法六:使用SQLEXCEPTION
DECLARE exit handler for sqlexception set @info=‘ERROR‘;
14.1.5 光标的使用
查询语句可能查询出多条记录,在存储过程和存储函数中使用光标来逐条读取查询结果集中的记录。有些书上将光标称为游标。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。
1. 声明光标
DECLARE cur_employee CURSOR FOR select name, age FROM employee;
2. 打开光标
OPEN cur_employee;
3. 使用光标
FETCH cur_employee INTO emp_name,emp_age;
4. 关闭光标
CLOSE cur_employee;
14.1.6 流程控制的使用
存储过程和存储函数中可以使用流程控制来控制语句的执行。MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句、WHILE语句来进行流程控制。
1. IF语句
IF age>20 then set @[email protected]+1;
elseif age=20 then @[email protected]+1;
else @[email protected]+1;
end if;
if search_conditioin then statement_list
[elseif search_condition] then statement_list]...
[else statement_list]
end if;
2. CASE语句
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE;
case AGE
when 20 then set @[email protected]+1;
else set @[email protected]+1;
end case;
3. LOOP语句
[begin_label:]LOOP
statement_list
END LOOP [end_label]
add_num:LOOP
SET @[email protected]+1;
end loop add_num;
4. LEAVE语句
add_num:LOOP
SET @[email protected]+1;
if @count=100 then
leave add_num; # 结束循环,与brean很像
end loop add_num;
5. ITERATE语句
add_num:LOOP
SET @[email protected]+1
if @count=100 then
leave add_num;
else if mod(@count,3)=0 then
iterate add_num;
select * from employee;
end loop add_num;
6. REPEAT语句
[begin_label:]repeat
statement_list
until search_condition
end repeat[end_label];
REPEAT
SET @[email protected]+1;
UNTIL @count=100
END REPEAT;
7. WHILE语句
[begin_label:]WHILE search_condition DO
statement_list
END WHILE
以上是关于存储过程和函数的主要内容,如果未能解决你的问题,请参考以下文章
tensorfolw配置过程中遇到的一些问题及其解决过程的记录(配置SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural N