mysql返回结果的存储过程

发表于: 08年1月5日 2008-1-5 16:03:13  评论    文章类别    字体大小 :

引言:
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的存储过程,这样做是否值得呢?