在数据库编程过程中经常会用到存储过程 , 相比 SQL 语句 , 存储过程更方便 , 快速 , 安全 ; 先将存储过程的相关介绍和使用方法总结如下 ;
存储过程 (Stored Procedure) 是在大型数据库系统中 , 一组为了完成特定功能的 SQL 语句集 , 存储在数据库中 , 经过第一次编译后再次调用不需要再次编译 , 用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数) 来执行它 , 存储过程是数据库中的一个重要对象 ; 存储过程中可以包含 逻辑控制语句
和 数据操纵语句
, 它可以接受参数 , 输出参数 , 返回单个或多个结果集以及返回值 ;
SQL注入
(但未彻底解决 , 例如将数据操作语言 DML
附加到输入参数) ;create procedure GetUsers()
begin
select * from user;
end;
call GetUsers();
drop procedure if exists GetUsers;
MySql 支持 IN (传递给存储过程) , OUT (从存储过程传出) 和 INOUT (对存储过程传入和传出) 类型的参数 , 存储过程的代码位于 BEGIN 和 END 语句内 , 它们是一系列 SQL 语句 , 用来检索值 , 然后保存到相应的变量 (通过指定INTO关键字) ;
下面的存储过程接受三个参数 , 分别用于获取用户表的最小 , 平均 , 最大分数 , 每个参数必须具有指定的类型 , 这里使用十进制值(decimal(8,2)) , 关键字 OUT 指出相应的参数用来从存储过程传出
create procedure GetScores(
out minScore decimal(8,2),
out avgScore decimal(8,2),
out maxScore decimal(8,2)
)
begin
select min(score) into minScore from user;
select avg(score) into avgScore from user;
select max(score) into maxScore from user;
end;
调用此存储过程 , 必须指定3个变量名(所有 MySql 变量都必须以 @
开始) , 如下所示 :
call GetScores(@minScore, @avgScore, @maxScore);
该调用并没有任何输出 , 只是把调用的结果赋给了调用时传入的变量 @minScore, @avgScore, @maxScore
, 然后即可调用显示该变量的值 :
select @minScore, @avgScore, @maxScore;
使用 IN 参数 , 输入一个用户 id , 返回该用户的名字 :
create procedure GetNameByID(
in userID int,
out userName varchar(200)
)
begin
select name from user
where id = userID
into userName;
end;
调用存储过程 :
call GetNameByID(1, @userName);
select @userName;
根据 ID 获取货品的价格 , 并根据参数判断是否折扣 :
create procedure GetPriceByID(
in prodID int,
in isDisc boolean,
out prodPrice decimal(8,2)
)
begin
declare tmpPrice decimal(8,2);
declare prodDiscRate decimal(8,2);
set prodDiscRate = 0.88;
select price from products
where id = prodID
into tmpPrice;
if isDisc then
select tmpPrice*prodDiscRate into tmpPrice;
end if;
select tmpPrice into prodPrice;
end;
该存储过程传入三个参数 , 货品 ID , 是否折扣以及返回的价格 , 在存储过程内部 , 定义两个局部变量 tmpPrice 和 prodDiscRate , 把查询出来的结果赋给临时变量 , 再判断是否折扣 , 最后把局部变量的值赋给输出参数 ; 调用如下 :
call GetPriceByID(1, true, @prodPrice);
select @prodPrice;
MySql 的命令行客户机的语句分隔符默认为分号 ;
,而实用程序也是用 ;
作为分隔符,这会使得存储过程的 SQL 出现语法错误,使用 DELIMITER $$
告诉命令行实用程序将 $$
作为新的语句结束分隔符,最后再使用 DELIMITER ;
改回来,如下所示:
DELIMITER $$
create procedure getUsers() begin select * from user;
end $$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE getcount()
BEGIN
SELECT
*
FROM
contract_user;
END $$
DELIMITER ;
CALL getcount();
个人网站: Github , 欢迎点击给星