设为首页 加入收藏

TOP

MySQL 存储过程学习
2015-11-10 12:17:36 来源: 作者: 【 】 浏览:7
Tags:MySQL 存储 过程 学习

MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。


存储过程的优点:


①重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。


②提高性能。存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。


③减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。


④安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。


创建简单的事例表有id,和name两个字段,并插入5条数据如下:


mysql> create table t1(id int not null primary key,name varchar(20) default null);


mysql> insert into t1 values(1,'name1'),(2,'name2'),(3,'name3'),(4,'name4'),(5,'name5');


mysql> select * from t1;


+----+-------+


| id | name? |


+----+-------+


|? 1 | name1 |


|? 2 | name2 |


|? 3 | name3 |


|? 4 | name4 |


|? 5 | name5 |


+----+-------+


5 rows in set (0.00 sec)


MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:


IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值;
OUT 输出参数:该值可在存储过程内部被改变,并可返回;
INOUT 输入输出参数:调用时指定,并且可被改变和返回。


IN参数例子:


mysql> delimiter //


mysql> create procedure p_in(IN p_id int)?


? ? -> begin


? ? -> delete from t1 where id = p_id;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?


? ? -> end


? ? -> //


Query OK, 0 rows affected (0.00 sec)


mysql> delimiter ;


mysql> call p_in(5);


Query OK, 1 row affected (0.03 sec)


mysql> select * from t1;


+----+-------+


| id | name? |


+----+-------+


|? 1 | name1 |


|? 2 | name2 |


|? 3 | name3 |


|? 4 | name4 |


+----+-------+


4 rows in set (0.00 sec)



OUT参数例子:


mysql> delimiter //


mysql> create procedure p_out(OUT p_out int)


? ? -> begin


? ? -> select count(id) from t1 into p_out;


? ? -> end


? ? -> //


Query OK, 0 rows affected (0.00 sec)


mysql> delimiter ;


mysql> call p_out(@p_out_result);


Query OK, 1 row affected (0.00 sec)


mysql> select @p_out_result;


+---------------+


| @p_out_result |


+---------------+


|? ? ? 4 |


+---------------+


1 row in set (0.00 sec)



同时存在IN,OUT参数:


mysql> delimiter //


mysql> create procedure p_in_out(IN p_in int,OUT p_out int)


? ? -> begin


? ? -> delete from t1 where id =p_in;


? ? -> select count(id) from t1 into p_out;? ? ? ? ? ? ?


? ? -> end


? ? -> //


Query OK, 0 rows affected (0.00 sec)


mysql> delimiter ;


mysql> select @p_in_out_result;


+------------------+


| @p_in_out_result |


+------------------+


|? ? ? ? 3 |


+------------------+


1 row in set (0.00 sec)


mysql> select * from t1;


+----+-------+


| id | name? |


+----+-------+


|? 1 | name1 |


|? 2 | name2 |


|? 3 | name3 |


+----+-------+


3 rows in set (0.00 sec)



INOUT参数:


mysql> select * from t1;


+----+-------+


| id | name? |


+----+-------+


|? 1 | name1 |


|? 2 | name2 |


|? 3 | name3 |


|? 4 | name4 |


|? 5 | name5 |


+----+-------+


5 rows in set (0.00 sec)


mysql> delimiter //


mysql> create procedure p_inout(INOUT p_inout int)


? ? ->begin


? ? ->select p_inout;


? ? ->set p_inout=4;


? ? ->select p_inout;


? ? -> delete from t1 where id =p_inout;


? ? ->end


? ? ->//


Query OK, 0 rows affected (0.00 sec)


mysql> delimiter ;


mysql> set @p_input=5;


mysql> call p_inout(@p_input);


+---------+


| p_inout |


+---------+


|? ? 5 |


+---------+


1 row in set (0.00 sec)


+---------+


| p_inout |


+---------+


|? ? 4 |


+---------+


1 row in set (0.00 sec)


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle GoldenGate 学习教程一:.. 下一篇DB2 10.5列式表存储技术

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: