首先,这篇文章是对上一篇文章的补充说明,在那篇文章中有一些内容并没有交代清楚
1.关于in类型的参数,个人的理解是这样的对于In类型的参数,存储过程中的代码对其进行的修改并不会影响该变量实际的值,属于有去无回
如以下代码所示
mysql> mysql> DELIMITER //
mysql> CREATE PROCEDURE demo_in_parameter(IN p_in int)
-> begin
-> select p_in;
-> set p_in=2;
-> select p_in;
-> end;
-> //
Query OK, 0 rows affected
mysql> DELIMITER ;
mysql> set @p_in=1;
Query OK, 0 rows affected
mysql>
mysql> call demo_in_parameter(@p_in);
+------+
| p_in |
+------+
| 1 |
+------+
1 row in set
+------+
| p_in |
+------+
| 2 |
+------+
1 row in set
Query OK, 0 rows affected
mysql> select @p_in;
+-------+
| @p_in |
+-------+
| 1 |
+-------+
在外面定义变量值为1,在存储过程中对其修改为2,但是在存储过程执行结束之后,再对变量的值进行输出,仍未1,并未改变
2.关于out类型参数,用于输出值,会忽略传入的值。在子程序内部可以对其进行修改。
如以下代码所示
mysql> delimiter //;
mysql> create procedure demo_out_parameter(out p_out int)
-> begin
-> select p_out;
-> set p_out=2;
-> select p_out;
-> end;
-> //
-> //;
Query OK, 0 rows affected
mysql> delimiter ;
mysql> set @p_out=1;
Query OK, 0 rows affected
mysql> call demo_out_parameter(@p_out);
+-------+
| p_out |
+-------+
| NULL |
+-------+
1 row in set
+-------+
| p_out |
+-------+
| 2 |
+-------+
1 row in set
Query OK, 0 rows affected
mysql> select @p_out;
+--------+
| @p_out |
+--------+
| 2 |
+--------+
在存储过程中对out类型参数第一次进行输出,发现结果为NULL
3.关于inout类型的参数,该类型数据综合了上述两种类型的特点,可以传入也可以被修改
如以下代码所示
mysql> delimiter //
mysql> create procedure demo_inout_parameter(inout p_inout int)
-> begin
-> select p_inout;
-> set p_inout=2;
-> select p_inout;
-> end;
-> //
Query OK, 0 rows affected
mysql> delimiter ;
mysql> set @p_inout=1;
Query OK, 0 rows affected
mysql> call demo_inout_parameter(@p_inout);
+---------+
| p_inout |
+---------+
| 1 |
+---------+
1 row in set
+---------+
| p_inout |
+---------+
| 2 |
+---------+
1 row in set
Query OK, 0 rows affected
mysql> select @p
_inout;
+----------+
| @p_inout |
+----------+
| 2 |
+----------+
1 row in set
关于@的说明
通过以下代码进行说明
mysql> select @x;
+------+
| @x |
+------+
| NULL |
+------+
1 row in set
mysql> select @gong_xi_we;
+-------------+
| @gong_xi_we |
+-------------+
| NULL |
+-------------+
1 row in set
对这两个变量进行输出,并不会像其他语言一样说变零未定义,也就是说不管你这个变量叫什么名字,都是可以直接拿来使用的,只不过初值为NULL,所以只需要对变量进行赋值即可
通过以下两种方式可进行赋值
mysql> set @x='gong xi we';
Query OK, 0 rows affected
mysql> select @x;
+------------+
| @x |
+------------+
| gong xi we |
+------------+
1 row in set
mysql> select 'abc' into @gong_xi_we;
Query OK, 1 row affected
mysql> select @gong_xi_we;
+-------------+
| @gong_xi_we |
+-------------+
| abc |
+-------------+
1 row in set
如果是在存储过程内部定义变量的话
需要declare var int;
set var=6; 表示定义一个int型变量var,并赋值为6