从零开始写MySql存储过程(三)关于IN,OUT,INOUT型参数以及@符号的补充

首先,这篇文章是对上一篇文章的补充说明,在那篇文章中有一些内容并没有交代清楚

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴塞罗那的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值