mysql存储过程《1》

存储过程:一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程的有点:

一:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。

二:存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。

三:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。

四:参数化的存储过程可以防止SQL注入式攻击。

以上的信息有点多余啊,是基础,也是常识,很多人都知道,下面直接入主题:

1 带有IN类型参数的存储过程:

DROP PROCEDURE
IF 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 PROCEDURE
IF EXISTS caseE;

CREATE PROCEDURE caseE (IN p INT)
BEGIN
	CASE p
WHEN 36 THEN
	INSERT INTO etl_province
VALUES
	(p, '国外2');


WHEN 37 THEN
	INSERT INTO etl_province
VALUES
	(p, '国外3');

#在没有ELSE的情况下,如果p没有36、37的情况,会抛出一个异常:ERROR 1339 (20000): Case not found for CASE statement 
ELSE
	INSERT INTO etl_province
VALUES
	(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;

猜你喜欢

转载自lxzqz.iteye.com/blog/2237101
今日推荐