Learning MySQL:存储过程1——创建过程之定义过程参数
理解:MySQL中的存储过程相当于在R中编写一个函数。
步骤:创建——执行(或调用)
创建过程语法如下:create procedure 过程名 ([过程参数[,...]) 过程体
执行过程语法如下:call 过程名 ([参数])
关键点:
创建过程中:a、定义过程参数;b、编写过程体
执行过程中:c、输入参数
本文讲述关键点a:定义过程参数
1、括号内定义过程参数
在创建过程语句中,在过程名后的括号内定义参数,这里必须注意的是,MySQL在 创建或执行过程语句中,名字后面的"()"是必须的,即使没有一个参数,也需要"()" 。
2、过程参数类型
过程参数共有三种参数类型:IN、OUT、INOUT,以下将举例说明各参数类型之含义
(1)栗子1:create procedure proc1(in x int)
这条语句的意思四:创建一个名为proc1的过程,该过程包含输入参数x,x的类型是整数
此处解释下什么叫输入参数,解释前先把调用的MySQL表想象为两个部分,一个是过程中,一个是过程外,有两个含义:第一个意思相当于调用正态分布函数时必须给定该正态分布的均值和方差,MySQL中过程也一样,有些过程必须输入原始参数值,也即将过程外的参数值提供给过程中;第二层含义也是本质的含义是指,过程外输入给过程中的参数值,在过程中的任何改变都只局限在过程中,对过程外不起任何作用,比如过程外设置的参数x值为1,你在过程中将输入参数x设置为2,过程外的值它还是1(备注下:这段话纯属个人理解,如有偏差欢迎指正)。
如果理解了in,下面的out和inout就很容易明白
这里要注意的是,in为系统默认类型,如不指定in、out、inout,系统默认为in,上述语句等同于create procedure proc1(x int)。
关于in的本质含义,即过程外输入给过程中,但过程中无法输出给过程外,见如下栗子:
mysql> delimiter // --因过程体中需用';'结束语句,创建过程前一般先更换分界符,此处更改为‘//’
mysql> create procedure test_in(in id int) --创建名为test_in 的过程
-> begin --过程体以begin开始,以end结束
-> set id=id+1; --set语句赋值
-> select id; --运算后显示id
-> end;
-> // --结束创建
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; --重新将分界符更改为';'
mysql> set @id=3; --过程外设定id初始值为3
Query OK, 0 rows affected (0.00 sec)
mysql> call test_in(@id); --执行过程test_in,过程参数输入@id
--过程输出结果为id=4,即id=3+1
mysql> select @id; --查看过程外@id值
--过程外@id的值仍为3
<备注,关于@id中的@,百度MySQL中局部变量和全局变量相关解释>
看到木有,系统中的@id仍然为3
(2)栗子2:create procedure proc2(out x int)
这条语句的意思四:创建一个名为proc2的过程,该过程包含输出参数x,x的类型是整数。
输出参数与输入参数正好相反,执行后过程中的参数值将输出给过程外,且执行前该参数无需过程外输入至过程中。栗子如下:
mysql> delimiter //
mysql> create procedure test_out(out id int) --创建一个名为test_out的过程,并含一个输出参数id
-> begin
-> set id=10;
-> select id;
-> end;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call test_out(@id); --执行过程test_out
--过程中的id值为10
mysql> select @id;
--过程外的id值被改为了10,在此之前为3,即过程中的修改可被返回至过程外
(3)栗子3:create procedure proc3(inout x int)
这条语句的意思四:创建一个名为proc3的过程,该过程包含输入输出参数x,x的类型是整数。
输入输出参数,即结合了in和out两类型的参数,执行前过程外输入给过程中参数值,同时过程中被重新计算的值将输出给过程外。完整栗子如下:
mysql> delimiter //
mysql> create procedure test_inout(inout id int) --创建一个名为test_inout的过程,并含一个输入输出参数id
-> begin
-> set id=id+1;
-> select id;
-> end;
-> //
Query OK, 0 rows affected (0.07 sec)
mysql> delimiter ;
mysql> set @id=3; --过程外设定id初始值为3
Query OK, 0 rows affected (0.00 sec)
mysql> call test_inout(@id); --执行test_inout过程,同时输入参数@id
mysql> select @id; --查看过程外的id值
--过程外的id值被改为了4,同out参数一样
温馨小贴士:
在创建过程前,除更改分界符之外,通常还有一个步骤,即在要创建一个名为X同时又不知道该表中是否存在名为X的过程时,可先删除X,语句为:
drop procedure if exists X; --删除一个名为X为过程,假如该过程存在的话
本文档主要参考来源:
《MySQL存储过程详解 mysql 存储过程》 http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
步骤:创建——执行(或调用)
创建过程语法如下:create procedure 过程名 ([过程参数[,...]) 过程体
执行过程语法如下:call 过程名 ([参数])
关键点:
创建过程中:a、定义过程参数;b、编写过程体
执行过程中:c、输入参数
本文讲述关键点a:定义过程参数
1、括号内定义过程参数
在创建过程语句中,在过程名后的括号内定义参数,这里必须注意的是,MySQL在 创建或执行过程语句中,名字后面的"()"是必须的,即使没有一个参数,也需要"()" 。
2、过程参数类型
过程参数共有三种参数类型:IN、OUT、INOUT,以下将举例说明各参数类型之含义
(1)栗子1:create procedure proc1(in x int)
这条语句的意思四:创建一个名为proc1的过程,该过程包含输入参数x,x的类型是整数
此处解释下什么叫输入参数,解释前先把调用的MySQL表想象为两个部分,一个是过程中,一个是过程外,有两个含义:第一个意思相当于调用正态分布函数时必须给定该正态分布的均值和方差,MySQL中过程也一样,有些过程必须输入原始参数值,也即将过程外的参数值提供给过程中;第二层含义也是本质的含义是指,过程外输入给过程中的参数值,在过程中的任何改变都只局限在过程中,对过程外不起任何作用,比如过程外设置的参数x值为1,你在过程中将输入参数x设置为2,过程外的值它还是1(备注下:这段话纯属个人理解,如有偏差欢迎指正)。
如果理解了in,下面的out和inout就很容易明白
这里要注意的是,in为系统默认类型,如不指定in、out、inout,系统默认为in,上述语句等同于create procedure proc1(x int)。
关于in的本质含义,即过程外输入给过程中,但过程中无法输出给过程外,见如下栗子:
mysql> delimiter // --因过程体中需用';'结束语句,创建过程前一般先更换分界符,此处更改为‘//’
mysql> create procedure test_in(in id int) --创建名为test_in 的过程
-> begin --过程体以begin开始,以end结束
-> set id=id+1; --set语句赋值
-> select id; --运算后显示id
-> end;
-> // --结束创建
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; --重新将分界符更改为';'
mysql> set @id=3; --过程外设定id初始值为3
Query OK, 0 rows affected (0.00 sec)
mysql> call test_in(@id); --执行过程test_in,过程参数输入@id
![]() |
--过程输出结果为id=4,即id=3+1
mysql> select @id; --查看过程外@id值
![]() |
--过程外@id的值仍为3
<备注,关于@id中的@,百度MySQL中局部变量和全局变量相关解释>
看到木有,系统中的@id仍然为3
(2)栗子2:create procedure proc2(out x int)
这条语句的意思四:创建一个名为proc2的过程,该过程包含输出参数x,x的类型是整数。
输出参数与输入参数正好相反,执行后过程中的参数值将输出给过程外,且执行前该参数无需过程外输入至过程中。栗子如下:
mysql> delimiter //
mysql> create procedure test_out(out id int) --创建一个名为test_out的过程,并含一个输出参数id
-> begin
-> set id=10;
-> select id;
-> end;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call test_out(@id); --执行过程test_out
![]() |
--过程中的id值为10
mysql> select @id;
![]() |
--过程外的id值被改为了10,在此之前为3,即过程中的修改可被返回至过程外
(3)栗子3:create procedure proc3(inout x int)
这条语句的意思四:创建一个名为proc3的过程,该过程包含输入输出参数x,x的类型是整数。
输入输出参数,即结合了in和out两类型的参数,执行前过程外输入给过程中参数值,同时过程中被重新计算的值将输出给过程外。完整栗子如下:
mysql> delimiter //
mysql> create procedure test_inout(inout id int) --创建一个名为test_inout的过程,并含一个输入输出参数id
-> begin
-> set id=id+1;
-> select id;
-> end;
-> //
Query OK, 0 rows affected (0.07 sec)
mysql> delimiter ;
mysql> set @id=3; --过程外设定id初始值为3
Query OK, 0 rows affected (0.00 sec)
mysql> call test_inout(@id); --执行test_inout过程,同时输入参数@id
![]() |
mysql> select @id; --查看过程外的id值
![]() |
--过程外的id值被改为了4,同out参数一样
温馨小贴士:
在创建过程前,除更改分界符之外,通常还有一个步骤,即在要创建一个名为X同时又不知道该表中是否存在名为X的过程时,可先删除X,语句为:
drop procedure if exists X; --删除一个名为X为过程,假如该过程存在的话
本文档主要参考来源:
《MySQL存储过程详解 mysql 存储过程》 http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
还没人赞这篇日记