喜悦国际村 专业PHP开发者社区's Archiver

水清无鱼 发表于 2010-7-22 04:06 PM

浅谈Mysql存储过程

[i=s] 本帖最后由 水清无鱼 于 2010-7-22 04:12 PM 编辑 [/i]

自从来到现在公司以后,大部分时间都是在使用sqlserver2005。所以经常会用到存储过程、job。接触的多了自然而然就觉得sqlserver的客户端的强大、方便。这次是为了直接在discuz里生成若干条注册邀请码,想着直接写库多方便啊,就顺便把mysql的存储过程看了下。
其实从mysql5就已经开始支持存储过程及触发器,phpmyadmin中不支持直接编写对存储过程(我自己写了几次),所以就直接命令行吧:[code]/*这里才是真正的起点,首先看看该表的数据*/
mysql> select count(*) from cdb_invites;
+----------+
| count(*) |
+----------+
|      261 |
+----------+
1 row in set (0.00 sec)[/code]PS,以下这段要注意的地方:
第一句:delimiter //   这是用[b]mysql[/b]客户端delimiter命令来把语句定界符从 ;变为//
第二句:创建一个存储过程名称为:hi。没有参数需要传入
中间的就是声明局部变量,然后循环插入。
最后一句:end // 这才是真正的结束。
然后从现在开始,除非重新登录mysql。否则当前你操作的命令都是以 //结尾。[code]/*创建一个存储过程,目的是为向某个表循环插入若干条数据*/
mysql> delimiter //
mysql> create procedure hi()
    -> begin
    -> declare a int(10);
    -> set a=1;
    -> while a<100 do
    -> insert into cdb_invites values (1,1279616286,1280480286,'10.0.7.7',a,0,0,1);
    -> set a=a+1;
    -> end while;
    -> end //
Query OK, 0 rows affected (0.00 sec)[/code][code]/*调用一次该存储过程。后查看该表,增加了99条新数据*/
mysql> call hi()//
Query OK, 1 row affected (0.01 sec)

mysql> select count(*) from cdb_invites//
+----------+
| count(*) |
+----------+
|      360 |
+----------+
1 row in set (0.00 sec)[/code]

水清无鱼 发表于 2010-7-22 04:07 PM

[i=s] 本帖最后由 水清无鱼 于 2010-7-22 04:13 PM 编辑 [/i]

[code]/*显示创建存储过程hi的字符串内容*/
mysql> show create procedure hi//
+-----------+----------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------+
| hi        |          | CREATE DEFINER=`root`@`localhost` PROCEDURE `hi`()
begin
declare a int(10);
set a=1;
while a<100 do
insert into cdb_invites values (1,1279616286,1280480286,'10.0.7.7',a,0,0,0);
set a=a+1;
end while;
end |
+-----------+----------+----------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)[/code][code]/*显示现有的存储过程*/
mysql> show procedure status//
+-----------------+--------------------+-----------+----------------+---------------------+---------------------+-----------

----+---------+
| Db       | Name       | Type      | Definer        | Modified            | Created             | Security_type | Comment |
+-----------------+--------------------+-----------+----------------+---------------------+---------------------+----------+
| mhqy_bbs | hi         | PROCEDURE | root@localhost | 2010-07-22 13:39:51 | 2010-07-22 13:39:51 | DEFINER       |         |
| mhqy_bbs | p1         | PROCEDURE | root@localhost | 2010-07-20 17:13:26 | 2010-07-20 17:13:26 | DEFINER       |         |
+-----------------+--------------------+-----------+----------------+---------------------+---------------------+----------+
2 rows in set (0.00 sec)[/code][code]/*删除一个已有的存储过程,没搞懂mysql的alter,所以宁愿删除了再重新create */
mysql> drop procedure p1//
Query OK, 0 rows affected (0.00 sec)[/code]

电脑民工 发表于 2010-7-22 09:13 PM

mysql不是有官方工具吗

用mysql 查询浏览器, 直接创建存储过程

游戏人间 发表于 2010-7-23 12:09 AM

哈哈,命令行有命令行的好处。对于本地开可以练很多东西,习惯了能培训出很多技巧来

c1a1o1 发表于 2010-8-10 02:29 PM

这个 有 真 东西 我收藏了 哈哈

村长夫人 发表于 2010-8-10 02:47 PM

用过MySQL的存储过程了
感觉存储过程这东西还是用在底层服务好一些 应用逻辑最好不要进去 否则改一点东西 dba会纠结的

水清无鱼 发表于 2010-8-10 03:08 PM

:lol对于多表关联的数据进行增删改的时候,还是喜欢用存储过程,省的php连续多次操作表。
封装在一个存储过程里了,有的时候再配合事务的支持。
应用逻辑变动,部分时候直接修改存储过程也挺方便,比如登录验证是一个存储过程,参数:用户名、密码。
本来可能存储过程只提供一个验证 用户名密码和数据库存储的是否一致的功能,后来又增加了 登录失败多次就封IP,又增加了过期用户不能登录等类似需求,只需修改存储过程就ok了。
其实LS的说的挺对的,应用逻辑变化,大多数时候会比较繁琐,主要是我们有自己的DBA,他极力支持我们用,所以……:lol

游戏人间 发表于 2010-8-10 03:30 PM

存储过程的主要目的还是省去解析sql语句的这个时间和资源。

如果是写成
$sql = "SELECT * FROM tablename WHERE x = '1' LIMIT 1";
$sql = "SELECT * FROM tablename WHERE x = '2' LIMIT 1";
$sql = "SELECT * FROM tablename WHERE x = '3' LIMIT 1";
三次查询可能mysql会认为是三条不同的sql语句,解析三次。而用存储过程的话则要简单的多了,它已经知道你是使用这存储过程,传进来参数之后马上就可以按条件去取数据...

unspace 发表于 2010-8-10 04:28 PM

没用过存储过程的学习飘过

电脑民工 发表于 2010-8-10 07:35 PM

如果是给自己做东西,存储过程和视图很方便
给别人做的话..如果要求不高能省就省哈哈

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.