引言:
mysql中有如下结构的表A:
ip1[int] ip2[int] ipaddress[varchar]
1 2 AAA
4 5 BBB
6 7 CCC
……
我们要创建一个存储过程,通过传入一个值ip,找出它对应区间的ipaddress
即:select ipaddress from A where ip>=ip1 and ip<=ip2
要在Mysql实现这个功能,
我们所要做的就是在mysql服务器中用变量存储一个查询结果,再用语句获取该变量代表的数据.
第一步:创建存储过程。
DELIMITER $
CREATE PROCEDURE `存储过程名`(out result Char(240))
BEGIN
select ipaddress into result from A where ip1<=@ip and ip2>=@ip;
END $
DELIMITER ;
上述中的@ip是我们存储在服务器的变量,用于存储我们需要传入的值。
第二步:使用存储过程
依次执行如下sql语句:
set @ip=4; //设置传入值
call 存储过程名; //执行存储过程
select @result ;
此时将返回:BBB
注意:上面的"@"为必须的符号。
Php使用该存储过程的实例。
$objcon=mysql_connect('localhost(服务器名)','getip(用户名)','123(该用户名密码)') ;
mysql_select_db('ipdata',$objcon); //此步骤选择数据库(ipdata)
mysql_query("set names 'gbk' "); //此步骤设置查询区域语言,防止Php查询mysql时出现乱码
mysql_query("set @ip=3194548457;");
$result=mysql_query("call 数据库名(@result);",$objcon) ; //此步骤把查询结果存储到变量@result
$result=mysql_query("select @result;",$objcon) ; //重变量@result中获取查询结果
$address=mysql_result($result,0,0); //获取查询结果赋值给变量$address
注意:上述存储过程只能返回一条记录一列值,多条记录或多列值将会产生错误。
关于Mysql创建返回多条记录的存储过程,请参见:
http://www.google.com/search?hl=en&newwindow=1&q=mysql+procedure+return++multiple++rows&btnG=Search
其大体思路:在存储过程中创建一张临时表,把匹配的记录存入临时表,再从临时表中直接获取多条记录(多列)的查询结果。
Mysql以前版本不支持存储过程,是否隐含着一点信息:存储过程在Mysql中不会大幅度提高性能(目前来说),如果我们还像MS SQL Server那样,为了提高性能,创建了一些比直接查询臃肿(创建临时表以及更复杂的操作)的SQL语句作为Mysql的存储过程,这样做是否值得呢?