浅谈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] [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] mysql不是有官方工具吗
用mysql 查询浏览器, 直接创建存储过程 哈哈,命令行有命令行的好处。对于本地开可以练很多东西,习惯了能培训出很多技巧来 这个 有 真 东西 我收藏了 哈哈 用过MySQL的存储过程了
感觉存储过程这东西还是用在底层服务好一些 应用逻辑最好不要进去 否则改一点东西 dba会纠结的 :lol对于多表关联的数据进行增删改的时候,还是喜欢用存储过程,省的php连续多次操作表。
封装在一个存储过程里了,有的时候再配合事务的支持。
应用逻辑变动,部分时候直接修改存储过程也挺方便,比如登录验证是一个存储过程,参数:用户名、密码。
本来可能存储过程只提供一个验证 用户名密码和数据库存储的是否一致的功能,后来又增加了 登录失败多次就封IP,又增加了过期用户不能登录等类似需求,只需修改存储过程就ok了。
其实LS的说的挺对的,应用逻辑变化,大多数时候会比较繁琐,主要是我们有自己的DBA,他极力支持我们用,所以……:lol 存储过程的主要目的还是省去解析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语句,解析三次。而用存储过程的话则要简单的多了,它已经知道你是使用这存储过程,传进来参数之后马上就可以按条件去取数据... 没用过存储过程的学习飘过 如果是给自己做东西,存储过程和视图很方便
给别人做的话..如果要求不高能省就省哈哈
页:
[1]