Mysql 存储过程入门

本文参考:https://blog.csdn.net/a__yes/article/details/52795793

                   https://blog.csdn.net/tojohnonly/article/details/70738629


1. 存储过程的概念

存储过程 (Stored Procedure) 是在大型数据库系统中 , 一组为了完成特定功能的 SQL 语句集 , 存储在数据库中 , 经过第一次编译后再次调用不需要再次编译 , 用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数) 来执行它 , 存储过程是数据库中的一个重要对象 ; 存储过程中可以包含 逻辑控制语句数据操纵语句 , 它可以接受参数 , 输出参数 , 返回单个或多个结果集以及返回值 ;


2. 存储过程的优缺点

优点 :

  1. 由于应用程序随着时间推移会不断更改 , 增删功能 , SQL 语句会变得更复杂 , 存储过程为封装此类代码提供了一个替换位置 ;
  2. 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中 , 所以存储过程运行要比单个的 SQL 语句块要快 ;
  3. 由于在调用时只需用提供存储过程名和必要的参数信息 , 所以在一定程度上也可以减少网络流量 , 简单网络负担 ;
  4. 可维护性高 , 更新存储过程通常比更改 , 测试以及重新部署程序集需要较少的时间和精力 ;
  5. 代码精简一致 , 一个存储过程可以用于应用程序代码的不同位置 ;
  6. 增强安全性 :
    • 通过向用户授予对存储过程 (而不是基于表) 的访问权限 , 它们可以提供对特定数据的访问 ;
    • 提高代码安全 , 防止 SQL注入 (但未彻底解决 , 例如将数据操作语言 DML 附加到输入参数) ;
    • SQLParameter 类指定存储过程参数的数据类型 , 作为深层次防御性策略的一部分 , 可以验证用户提供的值类型 (但也不是万无一失 , 还是应该传递至数据库前得到附加验证) ;

缺点 :

  1. 如果更改范围大到需要对输入存储过程的参数进行更改 , 或者要更改由其返回的数据 , 则仍需要更新程序集中的代码以添加参数 , 等等 ;
  2. 可移植性差 , 由于存储过程将应用程序绑定到 Server , 因此使用存储过程封装业务逻辑将限制应用程序的可移植性 ; 如果应用程序的可移植性在您的环境中非常重要 , 则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择 ;


3. 本次使用的工具是MySqlWorkbench

范例(1):
DELIMITER //                                          # DELIMITER // 声明语句结束符,用于区分; 
create procedure myTest(
out minScore int,
out avgScore decimal(8,2),
out maxScore int
)
begin
select avg(score) into avgScore from sc where sid=01;
select min(score) into minScore from sc where sid=01;
select max(score) into maxScore from sc where sid=01;
end;
//
DELIMITER ;
call myTest(@minScore, @avgScore, @maxScore);        #调用存储过程
select @minScore, @avgScore, @maxScore;
drop procedure if exists myTest;                      #删除存储过程

(数据来源sc表自己可以创建)

查询结果如下:



范例(2):

USE `mytest`;
DROP procedure IF EXISTS `sumAB`;

DELIMITER $$
USE `mytest`$$
CREATE PROCEDURE `sumAB` (
in a int,
in b int,
out c int )
BEGIN
if a is null then set a=0;
end if ;
if b is null then set b=0;
end if;
set c=a*b;
END$$

DELIMITER ;
call sumAB(3,2,@c);
select @c;

查询结果如下:


猜你喜欢

转载自blog.csdn.net/qq_25858235/article/details/80408826