存储过程:一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程的有点:
一:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
二:存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。
三:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
四:参数化的存储过程可以防止SQL注入式攻击。
以上的信息有点多余啊,是基础,也是常识,很多人都知道,下面直接入主题:
1 带有IN类型参数的存储过程:
?
DROP PROCEDUREIF EXISTS inPro;CREATE PROCEDURE inPro (IN cellId VARCHAR(15))BEGIN SELECT * FROM realtime_flow WHERE YEAR = '2015' AND MONTH = '08' AND DAY = '09' AND cell_id = cellId;END;
DROP PROCEDURE?IF EXISTS inPro,删除已经存在的存储过程inPro,尤其是在调试的过程中,这行代码很重要,不用每次都手动去删除相应的存储过程。
inPro为存储过程的名称,存储过程名称对大小写不敏感,改变大小写不会构成重载。
(IN cellId varchar(15)),IN代表参数类型为输入型,默认也为输入型,cellId为参数名称,varchar说明参数为字符串。
BEGEIN……END,存储过程的开始和结束,中间的部分即为存储过程要做的事情。
2 带有IN类型参数,并使用case方法的存储过程:
?
DROP PROCEDUREIF EXISTS caseE;CREATE PROCEDURE caseE (IN p INT)BEGIN CASE pWHEN 36 THEN INSERT INTO etl_provinceVALUES (p, '国外2');WHEN 37 THEN INSERT INTO etl_provinceVALUES (p, '国外3');#在没有ELSE的情况下,如果p没有36、37的情况,会抛出一个异常:ERROR 1339 (20000): Case not found for CASE statement ELSE INSERT INTO etl_provinceVALUES (100, '未提供');END CASE;END;
在使用case的时候需要注意,在没有ELSE的情况下,如果p没有36、37的情况,会抛出一个异常:ERROR 1339 (20000): Case not found for CASE statement。
case有两种表现形式,第一种,条件变量在case中,parameter与constant进行等于比对,符合哪个值就执行when对应的操作,最后如果都不相等就执行else对应的操作,除非你肯定你传的参数一定会有对应的when值对应,否则一定要有else步骤,避免程序抛出异常。
case parameter
? ? ? ? when constant then
? ? ? ??do something;
? ? ? ??when constant then
? ? ? ??do something;
else
? ? ? ??do something;
end case;
第二种,条件变量在when中,这样就可以在when中做复杂的条件判断,最后提醒,要有else步骤。
case
? ? ? ??when condition then
? ? ? ??do something;
? ? ? ??when condition then
? ? ? ??do something;
else
? ? ? ??do something;
end case;