1.基本语法
CREATE PROCEDURE 存储过程名 (参数列表) BEGIN SQL语句代码块 END |
例子:
IN X INT 表示一个存储过程参数类型为IN,参数类型为INT,名为X的参数。
【存储过程参数类型】:有三种——IN,OUT,INOUT,将在下文详解
CREATE PROCEDURE SP_TEST ( IN X INT) BEGIN SELECT X; SET X=100; SELECT X; END |
(由于mysql中的command line默认以“;”为分隔符,所以我是在navicat中的新建查询执行上面的语句。当然你也可以用delimiter命令修改分隔符来输入以上命令。)
调用:
SET @para=4; CALL SP_TEST(@para); |
显示结果如下:
本人在自建的一个名为bclsf中做此实验,之前的SP_TEST也是在这个数据库中创建的。
set @para=555;/*给一个名为@para的临时变量赋值为555(一旦关闭command line,其就会被销毁),在mysql中这些变量无需先define*/
call SP_TEST(@para);/*调用存储过程,SP_TEST,将@para作为参数传给它*/
下面显示的是SP_TEST两次SELECT 显示的结果
小节:这就是一个基础的存储过程,不依赖于任何表,虽然没有实际意义。但是就像"HELLO WORLD!"一样,可以对存储过程有一个概念。
2.存储过程参数类型
在上一小节说到的【
存储过程参数类型】参数类型,其有以下类型:
1.MySQL 存储过程 “IN” 参数:
相当于C中的传值,比如上一节中的例子,@para的值传到了SP_TEST的X上,SP_TEST在其内部随便怎么搞X,那也只是在搞X,与@para没有关系。并且从SP_TEST外面无法得到X的值。记住:这(mysql 存储过程中的"in"参数)是一个彻头彻尾的局部变量....不信,请看:
2.MySQL 存储过程 “OUT” 参数:
先把前面的SP_TEST drop掉,
重新创建SP_TEST,将参数定义为 OUT X INT.
CREATE PROCEDURE SP_TEST ( OUT X INT) BEGIN SELECT X; SET X=100; SELECT X; END |
从command line client中来验证:
@para的值根本没有传进去,SP_TEST中的第一次SELECT,X竟然是NULL!,
而执行了SP_TEST(@para)之后其SELECT @para竟然显示的是100。
mysql存储过程的“OUT”参数传入了地址,却没有传入值。其在内部的修改会直接影响外面的变量。——不管传入什么参数parameter,一开始在存储过程中必然是NULL,但是在存储过程中对其的赋值又是直接对parameter的赋值(parameter是指在存储过程外面定义的变量,比如@para)
这个概念有些不好理解,高级语言中没的对应的概念,也不清楚这样设计有什么用(难道是为了防止sql注入攻击?)。
3.MySQL 存储过程 “INOUT” 参数:
强迫症式操作,drop掉SP_TEST,执行下面语句:
CREATE PROCEDURE SP_TEST ( INOUT X INT) BEGIN SELECT X; SET X=100; SELECT X; END |
其实这就是C中的传值。不再废话,直接上图:
总结:
如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从 MySQL 存储过程返回值,那就使用“out” 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回,要使用“inout” 类型参数。
龙觉寺CSDN_BLOG...原创...不总结永远一知半解,一知半解比无知更可怕