本文共 1648 字,大约阅读时间需要 5 分钟。
MySQL 存储过程支持三种类型的参数:in、out 和 inout。这些参数类型在传递数据时有不同的行为,理解这些行为对于有效调用存储过程至关重要。本文将详细解释这三种参数类型的特点及其使用方法。
in 参数类似于 C 语言中的函数参数。在调用存储过程时,调用者可以传递值给存储过程。然而,存储过程在执行过程中可能会修改这些参数的值,但对调用者来说,这些修改是不可见的。例如:
create procedure pr_param_in(in id int);
当调用存储过程时,传递一个整数值:
call pr_param_in(10);
存储过程内部可以修改 id
的值,但调用者无法直接访问修改后的值。
create procedure pr_param_in(in id int)begin if id is not null then set id = id + 1; end if; select id as id_inner;end;
调用时:
call pr_param_in(10);
执行结果会显示 id_inner
为 11,但 id_out
仍为 10(假设存储过程未修改外部变量)。
out 参数用于从存储过程返回值给调用者。存储过程执行后,out 参数的值会被传回调用者。初始值为 null,即使调用者未传递值也为 null。
create procedure pr_param_out(out id int);
调用时:
call pr_param_out();
或:
set @id = 10;call pr_param_out();
示例存储过程:
create procedure pr_param_out(out id int)begin select null as id_inner_1; if id is not null then set id = id + 1; end if; select id as id_out;end;
调用时:
call pr_param_out();
结果中 id_out
为 1,而 id_inner_1
为 null。
inout 参数结合了 in 和 out 的特点。调用者可以通过 inout 参数传递值给存储过程,并且存储过程可以返回修改后的值给调用者。inout 参数的行为类似于 C 语言中的引用传值。
create procedure pr_param_inout(inout id int);
调用时:
call pr_param_inout(10);
示例存储过程:
create procedure pr_param_inout(inout id int)begin if id is not null then set id = id + 1; end if; select id as id_inner_2; if id is null then set id = 1; end if; select id as id_inner_3;end;
调用时:
call pr_param_inout(10);
结果中 id_inner_3
为 11,而 id_out
也是 11。
存储过程的参数可以设置默认值,减少调用时的参数传递量。例如:
create or replace procedure procdefault( p1 varchar2, p2 varchar2 default 'mark')
此时,调用时只需传递 p1
的值,p2
会使用默认值。
通过以上说明,可以看到不同参数类型的行为差异,并根据需求选择合适的参数类型。
转载地址:http://tkbfk.baihongyu.com/