MySQL8.0与SQL server 2017都是关系型数据库,两者在原理与技术方面有极高的相似度。本文主要简述笔者在学习过程中发现的两者有区别的部分,如果读者知道还有其他区别的点,欢迎进行评论补充,大家一起交流学习,共同成长!
1.在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句。为解决这个问题,通常可使用DELIMITER 语句将存储过程结束符号修改为其他字符,笔者统一将其设置为$$。
存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有一个或多个参数。MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程返回一个操作结果,而输入/输出参数既可以充当输入参数也可以充当输出参数。需要注意的是,参数的名称不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。为此,笔者统一将存储过程中的变量以$为前缀命名。
存储过程的主体部分包含在过程调用时需要执行的 SQL 语句,以关键字 BEGIN 开始,以关键字 END 结束。
drop procedure if exists sp1;
delimiter $$
--注意:MySQL语法规定自定义符合$$和delimiter之间必须至少有一个空格
--另外,不能直接在delimiter $$ 所在行的后面添加注释,否则无法创建存储过程。真有意思。。
create procedure sp1( in $a varchar(100)) --输入参数中的 IN 可以省略。
begin
declare $n,$m int;
set $n=1,$m=2;
if ($n>$m and $a='just a demo') then SELECT 11111;
else SELECT 22222;
end if;
end $$ --注意:MySQL语法规定自定义符合$$和end之间可以没有一个空格
delimiter ; --注意:MySQL语法规定分号和delimiter之间必须至少有一个空格
call sp1('just a demo'); --调用存储过程
/*在以下存储过程中,输入年份、客户名称和商品名称这三个参数,返回这个年度这个客户购买这个商品的
销售量、销售额与购买次