1.存储过程是什么
是一组为了完成特定功能的SQL语句集。经编译后存储在数据库中,是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。
存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
2.为什么要使用存储过程:
- 存储过程是已经被认证的技术!
- 存储过程会使系统运行更快!
- 存储过程是可复用的组件!它是数据库逻辑而不是应用程序。
- 存储过程将被保存!
3.存储过程的优点:
- 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
- 当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
- 存储过程可以重复使用,可减少数据库开发人员的工作量。
- 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
4.创建存储过程
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter中的每个参数由3部分组成。 这3部分分别是输入输出类型、参数名称和参数类型,其形式如下: [ IN | OUT | INOUT ] param_name type
CREATE PROCEDURE food_price_count (IN price_info1 FLOAT,IN price_info2 FLOAT, OUT count INT ) READS SQL DATA BEGIN DECLARE temp FLOAT; DECLARE match_price CURSOR FOR SELECT price FROM food; DECLARE EXIT HANDLER FOR NOT FOUND CLOSE match_price; SET @sum=0; SELECT COUNT(*) INTO count FROM food WHERE price>price_info1 AND price<price_info2 ; OPEN match_price; REPEAT FETCH match_price INTO temp; IF temp>price_info1 AND temp<price_info2 THEN SET @sum=@sum+temp; END IF; UNTIL 0 END REPEAT; CLOSE match_price; END CALL food_price_count(2,18,@count) ; SELECT @count, @sum ;
其中:
- IN表示输入参数;
- OUT表示输出参数;
- INOUT表示既可以是输入,也可以是输出;
- param_name参数是存储过程的参数名称;
- type参数指定存储过程的参数类型,该类型可以是MySQL数据库的任意数据类型。
characteristic参数有多个取值。其取值说明如下:
- LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。
- [NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。
- { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。
- SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认情况下,系统指定的权限是DEFINER。
- COMMENT 'string':注释信息。
技巧:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是,如果存储过程中没有使用SQL语句,最好设置为NO SQL。而且,存储过程中最好在COMMENT部分对存储过程进行简单的注释,以便以后在阅读存储过程的代码时更加方便。
5.调用存储过程
MySQL中使用
CALL语句来调用存储过程。调用存储过程后,数据库系统将执行存储过程中的语句。
然后,将结果返回给输出值。CALL语句的基本语法形式如下:
CALL sp_name([parameter[,…]]) ;
6.查看存储过程的定义
MySQL中可以通过SHOW CREATE语句查看存储过程和函数的状态。其基本语法形式如下:
SHOW CREATE { PROCEDURE |FUNCTION} sp_name ; #“PROCEDURE”参数表示查询存储过程; #“FUNCTION” 参数表示查询存储函数; #“sp_name” 参数表示存储过程或函数的名称。
7.修改存储过程
修改存储过程和函数是指修改已经定义好的存储过程和函数。
MySQL中通过
ALTER PROCEDURE语句来修改存储过程。通过ALTER FUNCTION语句来修改存储函数。
MySQL中修改存储过程和函数的语句的语法形式如下:
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...] #characteristic: { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'
8.删除存储过程
删除存储过程和函数指删除数据库中已经存在的存储过程和函数。
MySQL中使用DROP PROCEDURE语句来删除存储过程。通过DROP FUNCTION语句来删除存储函数。其基本形式如下:
DROP { PROCEDURE| FUNCTION } sp_name;
注:本文转自http://blog.chinaunix.net/uid-26602509-id-3139913.html