当前位置: 移动技术网 > IT编程>数据库>Mysql > 窥探mysql存储过程细节

窥探mysql存储过程细节

2017年12月12日  | 移动技术网IT编程  | 我要评论

存储过程,可以这样认为,将我们需要特殊处理的sql语句封装成函数,当需要的时候我们只需调用这个函数就可以实现我们想要的操作,这个过程我们可以称之为存储过程。当然了,真正存储过程的定义不是这样的。但是我们可以这样简单的去理解存储过程。

下面我们看一个简单的使用存储过程的例子。

首先我们新建一张表 proced:

create table proced(
     id int(5) primary key auto_increment,
     name varchar(50),
     type varchar(50)
);

然后我们需要向这个表中插入10万条数据,这个时候我们需要借助存储过程来实现这一功能。

mysql> delimiter //
mysql> create procedure adddata()
     -->begin
     -->declare n int default 0;
     -->while n<100000
     -->do
     -->insert into proced(name,type) values(‘迹忆博客','onmpw');
     -->set n = n+1;
     -->end while;
     -->end
     -->//
mysql> delimiter ;
mysql> call adddata();

使用上述存储过程,我们就可以向proced表中插入10万条数据了。

借助上述小例子,我们来讲一下如何创建一个存储过程。

创建存储过程

首先我们来看一下创建存储过程的语法:

create procedure procedure_name(in/out/inout parameter type)
begin
     procedure_body
end

这个过程比较简单。

在上面的小例子中我们看到在创建存储过程之前使用了delimiter //;,创建完成之后又再次 使用了命令 delimiter ;。

delimiter 是界定符,我们知道,在mysql命令行客户端,是通过分号(;)来界定一个命令是否完成的。在存储过程中,我们会多次使用到分号,但是这并不代表命令的结束,所以说我们需要使用delimiter命令来改变这个界定符。

mysql> delimiter //;  改变界定符为 //
mysql> delimiter ; 重新改变界定符为分号

所以说我们如果使用mysql命令行创建存储过程的话,我们必须在创建存储过程之前使用上述命令改变界定符。

接下来我们看到procedure_name()中的in/out/inout,这是代表什么意思呢?

一个in类型的参数会传递一个值到存储哦过程中,也就是我们在编程语言中自定义函数的参数。如果参数前面没有指定是in/out/inout,那默认会是in,看下面的例子:

mysql>delimiter //
mysql> create procedure in_proced(in param varchar(100))
      -->begin
      -->insert into proced(name,type) values(param,'onmpw');
      -->end
      -->//
mysql>delimiter ;
mysql> call in_proced(‘onmpw.com');

这就是在参数前指定in的含义。

下面我们看out,指定为out的参数将从存储过程中传递一个值给调用者,也就是说,out可以认为这个参数就是我们自定义函数中的返回值。

mysql> delimiter //
mysql> create procedure out_proced(out param int)
     -->begin
     -->select count(*) into param from proced;
     -->end
     -->//
mysql>delimiter ;
mysql> call out_proced(@a);
mysql>select @a;
+------+
| @a |
+------+
| 3   |
+------+

最后就是inout,很明显inout指定的参数被调用者初始化,其值在存储过程中可以被修改,并且任何改变对于调用者来说都是可见的。

看下面的例子:

mysql> delimiter //
mysql> create procedure inout_proced(inout param int)
     --> begin
     --> select count(*) into param from proced where id>param;
     --> end
     -->//
mysql>delimiter ;
mysql>set @a = 3;
mysql>call inout_proced(@a);
mysql>select @a; 查看变量的值是否改变

以上就是创建一个简单的存储过程的方式。

删除存储过程

删除存储过程的语法:

drop procedure if exists procedure_name

下面是使用实例:

mysql>drop procedure if exists proced;

修改存储过程

存储过程的修改时不能改变存储过程内的sql语句的,只能改变其属性,其语法如下:

alter procedure proc_name [characteristic ...]

characteristic:
  comment 'string'
  | language sql
  | { contains sql | no sql | reads sql data | modifies sql data }
  | sql security { definer | invoker }

总结:无论是删除存储过程还是修改存储过程,必须保证你要修改或者删除存储过程没有被其他存储过程使用,例如你有存储过程a,和存储过程b。a在b中被使用,如果我们想修改a或者删除a,必须确保b中不再使用a,否则如果我们删除a以后,再调用b的时候就会报错。

举个例子:

mysql>delimiter //
mysql>create procedure a(in pa1 int,out pa2 int)
     -->begin
     -->select count(*) into pa2 from proced where id>pa1;
     -->end
     -->//
mysql>create procedure b(inout pa int)
     -->begin
     -->declare v int;
     -->call a(pa,v);
     -->set pa = v;
     -->end
     -->//
mysql>delimiter ;
mysql>drop procedure a;
mysql>set @a=5;
mysql>call b(@a);
error 1305 (42000): procedure test.a does not exists

以上就是对存储过程简单的介绍,希望对大家学习mysql存储过程有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网