Mysql存储过程使用总结:
存储过程是MYSQL在5.0版本开始支持的,它一个被定义并保存在数据库服务器中的SQL语句集,是一种介于应用程序和数据库间的编程接口,也是封装重复性工作的一种有效方法,它支持用户变量、条件执行及其它的编程功能,具体如下:
· 存储过程的用途
· 存储过程的语法
· 存储过程的使用
一、存储过程的用途
1、封装常用的SQL语句集,解决重复性工作;
2、对数据进行倒入和导出,常用在数据同步及报表导出导出;
3、与触发器结合使用,实现复杂的功能;
注:以上只是常用的情景,其实还有很多业务需求使用。
二、存储过程的语法
1、创建
CREATE PROCEDURE procedure_name ([paramters[,…]])[attributes]
BEGIN
body_statement
END;
注:
procedure_name:存储过程的名字,建议以下划线_分割多个单词
paramters:存储过程的过程参数,包含:IN、OUT及INOUT,具体:
IN 代表输入或传入值,在存储过程中被修改,但不返回;
OUT 代表输出或传出值,在存储过程中被修改,并返回;
INOUT 代表输入输出,在存储过程中被修改,并返回;
body_statement:存储过程体,这里可以放入SQL集,也可以内嵌存储过程;
2、删除
DROP PROCEDURE [IF EXISTS] procedure_name;
注:
procedure_name:存储过程名字,如果存储过程存在(IF EXISTS)再删除
3、修改
ALTER PROCEDURE procedure_name ([paramters[,…]])[attributes]
BEGIN
body_statement
END;
注:与创建的格式基本相同
4、执行
CALL procedure_name ([paramters[,…]]);
注:使用CALL来调用存储过程,不同的数据库调用的关键字不同
5、分隔符定义
MYSQL中默认是以;号为分隔符的,如果没有声明不同的分隔符,MYSQL的编译器会误将存储过程当作SQL编译,则样执行时就会报错,所以需要使用DELIMITER设置不同的分隔符,例如:DELIMITER |,记得使用完之后,恢复;的定义。
三、存储过程的使用
1、内部使用
定义:
DELIMITER |
USE cwteam |
#根据传入的ID值 返回对应的内容
DROP PROCEDURE IF EXISTS p_get_product_type |
CREATE PROCEDURE p_get_product_type(IN ID int,OUT type varchar(15))
BEGIN
IF(ID=1) THEN
SET type = 'PTNO_2016031000';
END IF;
IF(ID=2) THEN
SET type = 'PTNO_2016031001';
END IF;
END |
#调用上面的存储过程获得特定值座位当前存储过程之行SQL的条件
#并返回查询的结果
DROP PROCEDURE IF EXISTS nums_from_product |
CREATE PROCEDURE nums_from_product(IN type int,OUT count_nums int)
BEGIN
#获得产品类型字符串#
SET @type = type;
SET @typeStr = NULL;
#调用第一个存储过程
CALL p_get_product_type(@type,@typeStr);
#拼接SQL字符串
SET @selectSql = CONCAT('SELECTCOUNT(*) FROM t_product_item WHERE pfid=?');
PREPARE stmtselect FROM@selectSql;
EXECUTE stmtselect USING @typeStr;
DEALLOCATE PREPARE stmtselect;
END |
DELIMITER ; #恢复;
调用:
SET @nums = NULL;#设置变量 用来存储查询的结果
CALL nums_from_product(1,@nums);
查询:
SELECT @nums;
结果:
上面的例子:通过调用nums_from_product存储过程,并传入不同的ID值,这个值是为存储过程p_get_product_type的输入参数,该过程返回的内容作为nums_from_product的SQL查询条件,最重结果存放在变量nums中,并使用SELECT查询,请查看代码注释。
2、PHP中的使用
<?php
// 链接mysql
$conn = mysql_connect('localhost','root','');
if(!$conn) {
echo 'Could notconnect the db server!';
return;
}
// 选择数据库
mysql_select_db('cwteam');
// 调用存储过程
mysql_query($procSql.$procSql2);
echo $procSql.$procSql2;
$result = mysql_query('CALLnums_from_product(1,@nums)');
// 显示数据
$array = mysql_fetch_array($result);
echo 'result:';print_r($array[0]);
?>
结果:
打印的结果与上面内部使用的结果相同。一般情况下,应用程序只调用已经创建好的存储过程,获得指定数据或实现某种功能,当然是可以在应用程序创建的,这种方式也比较简单直接拼接SQL创建存储过程即可。