存储过程

1.存储过程由一组特定功能的SQL语句组成,对于大型应用程序优势较大,相对不使用存储过程,具有以下优点:

  a.性能提高,因为存储过程是预编译的,只需编译一次,以后调用就不须再编译

  b.重用性提高,可以“一次编写,随便调用”

  c.安全性提高,可以一定程度上防止SQL注入,还可以使用权限控制

  d.减少网络流量,提高网站访问速度

2.存储过程的建立,使用create procedure语句,语法如下

CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body proc_parameter:
[ IN | OUT | INOUT ] param_name type func_parameter:
param_name type type:
Any valid MySQL data type

示例:

use test;
delimiter $$  //改变语句分隔符
create procedure test(in a varchar(10),out b int) //in 输入参数 out 输出 inout 输入输出
begin select concat('hello ',a);
select count(1) into b from tb_6; end$$ delimiter ;
call test('world',@c); //使用call调用存储过程
select @c;

参数为INOUT示例

delimiter $$

create procedure test(inout b int)
begin select b;
set b=10;
select b;
select count(1) into b from tb_5; end$$ delimiter ;
set @b = 100;
call test(@b);
select @b; --------------------------结果-----------------------
mysql> call test(@b);
+------+
| b |
+------+
| 20 |
+------+
1 row in set (0.00 sec) +------+
| b |
+------+
| 10 |
+------+
1 row in set (0.01 sec) Query OK, 1 row affected (0.04 sec) mysql> select @b;
+--------+
| @b |
+--------+
| 120832 |
+--------+
1 row in set (0.00 sec)

变量的定义,赋值,以及用户变量示例

delimiter $$

create procedure test()
begin declare i int default 1; --变量的定义
select i;
set i = 100; --变量的赋值
select i; end$$ delimiter ;
//结果
mysql> call test();
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.00 sec) +------+
| i |
+------+
| 100 |
+------+
1 row in set (0.01 sec) mysql> set @t='hehe'; --用户变量
Query OK, 0 rows affected (0.00 sec) mysql> select @t;
+------+
| @t |
+------+
| hehe |
+------+
1 row in set (0.00 sec)

3.存储过程的更改,删除

ALTER PROCEDURE proc_name [characteristic ...]

drop procedure proc_name

4.查看存储过程的信息

mysql> select name from mysql.proc where db='test';
+----------+
| name |
+----------+
| add_user |
| partPage |
| test |
+----------+
3 rows in set (0.00 sec) --或者使用show create procedure proc_name

5.存储过程的控制结构

if-then-else-end if语句

delimiter $$
create procedure proc(in i int,out res varchar(30))
begin declare j int;
set j = 20;
if i<j then
set res = 'i is smaller than j';
else
set res = 'i is bigger than j';
end if; end
--结果
mysql> call proc(30,@ret);
Query OK, 0 rows affected (0.00 sec) mysql> select @ret;
+--------------------+
| @ret |
+--------------------+
| i is bigger than j |
+--------------------+
1 row in set (0.00 sec)

case-when-then-end case语句

delimiter $$
create procedure proc(in i int,out res varchar(30))
begin
case i
when 1 then
set res='星期一';
when 1 then
set res='星期二';
when 1 then
set res='星期三';
when 1 then
set res='星期四';
when 1 then
set res='星期五';
when 1 then
set res='星期六';
when 1 then
set res='星期日';
end case;
end$$
--结果
mysql> call proc(1,@ret);
Query OK, 0 rows affected (0.03 sec) mysql> select @ret;
+--------+
| @ret |
+--------+
| 星期一 |
+--------+
1 row in set (0.03 sec)

循环while-do-end while语句

DELIMITER $$

CREATE  PROCEDURE `add_user`()
begin
declare i int default 1;
while i<=50 do insert into users(userName,email,passwd,registion_date) values(concat('zhumuxian',i),concat('zhumuxian',i,'@163.com'),sha1(''),now());
set i=i+1; end while; end

示例,分页存储过程

CREATE  PROCEDURE `partPage`(in perPageNum int ,in currentPage int)
begin declare perNum int default 10;
declare curPage int default 1;
declare start0 int ; set perNum=perPageNum;
set curPage=currentPage; set start0=(curPage-1)*perNum;
select user_id,userName,email,registion_date from users limit start0,perNum; end

存储函数与存储过程在语法上有点类似,不同点:

  存储函数需要返回一个类型,且函数体中必须要有一个有效的return语句。

  它们调用的方式不同,过程使用call调用,函数使用select调用。

  函数只能返回一个结果值,而过程可以返回一个或多个结果集,等等。

存储函数的创建,语法如下

CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body

创建示例

delimiter $$
create function getDate()
returns varchar(255)
begin
declare str varchar(255) default '0000-00-00 00:00:00';
set str = date_format(now(),'%Y年%m月%d日 %H时%i分%S秒');
return str;
end $$
delimiter ; --结果
mysql> select getDate();
+-----------------------------+
| getDate() |
+-----------------------------+
| 2015年04月16日 15时16分46秒 |
+-----------------------------+
1 row in set (0.08 sec)

如在创建函数时碰到ERROR 1418 (HY000)错误,可以设置log_bin_trust_function_creators=TRUE即可。

mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON |
+---------------------------------+-------+
1 row in set (0.00 sec)

分支结构示例

delimiter $$
create function sub_str(str varchar(255),n int)
returns varchar(255)
begin
if isnull(str) then return '';
elseif char_length(str)<n then return str;
else return left(str,n);
end if;
end$$
delimiter ; --结果
mysql> select sub_str('wozhidaole',1);
+-------------------------+
| sub_str('wozhidaole',1) |
+-------------------------+
| w |
+-------------------------+
1 row in set (0.00 sec)

触发器,是一种特殊的存储过程,在特定表执行更新,插入,删除操作时触发,具有更好的数据控制能力,创建语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body

示例

delimiter $$
create trigger pp after insert on t1 for each row
begin
insert into t2 values (new.id);
end$$
delimiter ;

删除触发器

mysql> drop trigger pp;
Query OK, 0 rows affected (0.00 sec)

查看所有触发器

mysql> show triggers\G
*************************** 1. row ***************************
Trigger: pp
Event: INSERT
Table: t1
Statement: begin
insert into t2 values (new.id);
end
Timing: AFTER
Created: NULL
sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.01 sec)

查看某一个触发器信息

mysql> show create trigger pp\G
*************************** 1. row ***************************
Trigger: pp
sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
SQL Original Statement: CREATE DEFINER=`root`@`localhost` trigger pp after insert on t1 for each row
begin
insert into t2 values (new.id);
end
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
mysql> select * from information_schema.triggers where trigger_name='pp'\G
*************************** 1. row ***************************
TRIGGER_CATALOG: def
TRIGGER_SCHEMA: test
TRIGGER_NAME: pp
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: def
EVENT_OBJECT_SCHEMA: test
EVENT_OBJECT_TABLE: t1
ACTION_ORDER: 0
ACTION_CONDITION: NULL
ACTION_STATEMENT: begin
insert into t2 values (new.id);
end
ACTION_ORIENTATION: ROW
ACTION_TIMING: AFTER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
ACTION_REFERENCE_OLD_ROW: OLD
ACTION_REFERENCE_NEW_ROW: NEW
CREATED: NULL
SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
DEFINER: root@localhost
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
1 row in set (0.09 sec)

MySQL学习笔记九:存储过程,存储函数,触发器的更多相关文章

  1. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

  2. Oracle数据库游标,序列,存储过程,存储函数,触发器

    游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...

  3. MySQL学习笔记(四)—存储过程

    一.概述      存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...

  4. PL/SQL&存储过程||存储函数&触发器

    plsql 有点:交互式  非过程化   数据操纵能力强   自动导航语句简单   调试简单   想率高 声明类型的方式 1.基本类型 2.引用变量 3.记录型变量 基本格式 declare 声明 b ...

  5. Mysql学习笔记(八)由触发器回顾外键约束中的级联选项

    近些天都没有写博客.在学习mysql的知识,通过学习和练习,也熟悉了mysql的函数.触发器.视图和存储过程.并且在实际的开发过程中也应用了一小部分.效果还是十分理想的. 今天晚上在学习触发器模仿in ...

  6. Mysql学习笔记(十二)触发器

    学习内容: 1.触发器: 什么是触发器?我们什么时候能够使用触发器?   触发器就是用来监听某个表的变化,当这个表发生变化的时候来触发某种操作..比若说两个表是相互关联的,当我们在对其中一个表格进行操 ...

  7. MySql学习笔记(五) —— 存储过程

    存储过程是MySql 5支持的特性,它是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之 ...

  8. mysql学习笔记:存储过程

    use test; drop table if exists t8; CREATE TABLE t8(s1 INT,PRIMARY KEY(s1)); drop procedure if exists ...

  9. MySQL学习笔记七:存储引擎

    1.MySQL存储引擎的设计采用“插件式”方案,用户可以很方便地选择使用哪种存储引擎,想使用mysql没有提供的引擎时,可以自己安装进去. 查看支持的存储引擎 mysql> show engin ...

随机推荐

  1. STM32之待机唤醒

    前段时间我稍微涉及节能减排大赛..倡导节能的社会..没错了.你真是太聪明了..知道了我今天要讲关于STM32节能方面的模块..没错..这标题已经告诉你了是吧..哦,对,标题有写..所以..言归正传.至 ...

  2. Learning Play! 2.4

    1) Activator Download typesafe-activator-1.3.5.zip, extract, set path 2) Create new project activato ...

  3. 机器学习&深度学习资料

    机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 1) 机器学习(Machine Learning)&深度学习(Deep Lea ...

  4. >hibernate-session中的方法

    1.操作实体对象的方法 save()  保存 update() 更新 saveOrUpdate() 保存或更新 delete() 删除 2.操作缓存的方法 clear()  清除所有缓存 evit() ...

  5. ArcGIS AddIN开发:如何调用ArcMap中的选择工作空间的窗体

    示例代码如下: public static IWorkspaceName BrowseWorkspace(int hwnd,out IWorkspace ws) { IGxObjectFilterCo ...

  6. Unity之CharacterController 碰撞问题总结

    CharacterController 不会受到scene的重力影响,自带物理碰撞检测,在脱离导航网格的应用场景下(比如飞行),是很有优势的Unity原生工具组件.如果在复杂的应用场景里,会有多种CC ...

  7. windows下C++高精度计时

    写代码时,经常会计算某一段代码的运行时间,以下提供一个微秒级别的类供参考 class CTimeCost { public: CTimeCost(const string &str) : m_ ...

  8. VS2015安装&简单的C#单元测试

    <软件工程>开课已经三周了,三周的上课感觉就是老师教授的概念性东西少了不少,基本就是贯穿“做中学”的教学理念,三周的时间让我学到了挺多东西,很多东西都是课本没有的. 这周的任务就是安装VS ...

  9. 为jQuery添加Webkit的触摸方法支持

    前些日子收到邮件,之前兼职的一个项目被转给了其他人,跟进的人来问我相关代码的版权问题. 我就呵呵了. 这段代码是我在做13年一份兼职的时候无聊加上去的,为jQuery添加触摸事件的支持.因为做得有点无 ...

  10. 用FlexGrid做开发,轻松处理百万级表格数据

    表格数据处理是我们项目开发中经常会遇到的设计需求之一,所需处理的数据量也较大,通常是万级.甚至百万级.此时,完全依赖平台自带的表格工具,往往无法加载如此大的数据量,或者加载得很慢影响程序执行. 那么, ...