MySQL的存储过程——参数传递

什么是存储过程

1、mysql5.0开始支持存储过程

2、存储过程就是一组sql语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于Java语言中的方法

3、存储过程就数据sql语言层面的代码封装与重用

存储过程的特性

1、有输入输出参数,可以声明变量,有if/else,case ,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能

2、函数的普通特性:模块化,封装,代码复用

3、速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤。

格式:

delimiter 自定义结束符号

create procedure 存储名( [in ,out ,inout] 参数名 数据类型...)

begin

sql 语句

end 自定义的结束符号

delimiter;

DELIMITER $$

CREATE PROCEDURE pro1()

BEGIN

SELECT NAME,age FROM emp2;

END $$

DELIMITER;

CALL pro1(); ——调用存储过程

1、局部变量(用户自定义,在begin/end块中有效)

语法:declare var_name type[default var_value];

举例:declare nickname varchar(32);

DELIMITER $$

CREATE PROCEDURE pro3()

BEGIN

DECLARE var_name VARCHAR(32) DEFAULT 'aaa';

SET var_name='张三';

#select var_name;

SELECT NAME,age FROM emp2

WHERE NAME=var_name;

END $$

DELIMITER;

CALL pro3();

还可以使用select...into 语句为变量赋值,基本语法如下:

select col_name [...] into var_name[...] from table_name where condition

当将查询结果赋值给变量时,该查询语句返回结果只能是单行单列。

2、用户变量(当前会话有效,类比java的成员变量)

语法:@var_name 不需要提前声明,使用即声明

DELIMITER $$

CREATE PROCEDURE proc6()

BEGIN

SET @var_name='张三';

SELECT @var_name;

END $$

delimiter;

CALL proc6()

SELECT @var_name ——在begin外也可以使用

3、系统变量

1、系统变量分为全局变量和会话变量

2、全局变量在mysql启动时由服务器自动初始化为默认值,可以通过my.ini这个文件来更改

3、会话变量在新建连接时,由mysql来初始化,会将全局变量复制一份,作为会话变量,没进行修改的话,所有值是跟全局变量一样的

4、会话变量修改只影响当前连接会话,全局变量会影响整个服务器

5、有些可以利用语句进行动态修改,有些系统变量的值是只读的,对于那些可以修改的系统变量,我们可以用set进行更改。

语法@@global.var_name(全局变量)

show global variables; ——查看全局变量

select @@global.auto_incerment_increment; ——查看某全局变量

set global sort_buffer_size=40000; ——初始化或修改全局变量的值

set @@global.sort_buffer_size =30000; ——初始化或修改全局变量的值(为32768,不能小于这个值)

语法@@session.var_name(会话变量)

show session variables; ——查看会话变量

select @@session.auto_incerment_increment; ——查看某会话变量

set session sort_buffer_size=40000; ——初始化或修改会话变量的值

set @@session.sort_buffer_size =30000; ——初始化或修改会话变量的值(为32768,不能小于这个值)

存储过程传参

1、(in,可以传多个参数)(in param1 varchar(20),in param2 int ...)

in表示传入的参数,可以传入数值或者变量,即使传入变量,并不会更改变量的值,可以内部更改,仅仅作用在函数范围内。

--输入员工的工号,返回员工的信息

delemiter $$

create procedure dec_param(in param_empno varchar(20))

begin

select * from emp where empno=param_empno;

end $$

delimiter ;

call dec_param('1001');

2、(out)

表示从存储过程内部传值给调用者

--传入员工的编号,返回员工的姓名(返回单个值)

delimiter $$

create procedure proc(in empno int ,out out_name varchar())

begin

select ename into out_name from emp where emp.empno=empno;

end $$

delimiter;

call proc(1001,@o_ename);

select @o_ename;

传入员工的编号,返回员工的姓名和薪资(返回多个值)

delimiter $$

create procedure proc(in empno int ,out out_name varchar(),out out_sal decimal(7,2))

begin

select ename,sal

into out_name,out_sal

from emp where emp.empno=empno;

end $$

delimiter;

call proc(1001,@o_ename,@o_sal);

select @o_ename,@o_sal;

3、inout

inout表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入的值也可以修改变量的值(即使函数执行完)

--传入员工名,拼接部门号,传入薪资,求出年薪

delimiter $$

create procedure proc(inout inout_ename varchar(50),inout inout_sal int)

begin

select concat(deptno,"_",inout_ename) into inout_ename from emp where ename=inout_ename;

set inout_sal=inout_sal*12;

end $$

delimiter;

set @inout_ename='关羽';

set @inout_sal=3000;

call proc(@inout_ename,@inout_sal );

select @inout_ename;

select @inout_sal;

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL存储过程中,可以使用in和out关键字来传递参。in参表示输入参,可以在存储过程内部使用;out参表示输出参,可以将结果传递给调用者。 在创建存储过程时,需要使用delimiter命令来指定分隔符为$$,然后使用create procedure语句定义存储过程的名称和参。在begin和end之间编写SQL语句,通过select语句将结果赋值给out参。创建结束后,再次使用delimiter命令将分隔符设置为;。 例如,可以创建一个名为proc08的存储过程,接收一个员工编号作为输入参,返回员工名字作为输出参。具体创建过程如下: delimiter $$ create procedure proc08(in empno int, out out_ename varchar(50)) begin select ename into out_ename from emp where emp.empno = empno; end $$ delimiter ; 调用存储过程时,需要使用call语句并传入对应的参。例如,调用proc08存储过程并将结果保存在变量@o_ename中的示例代码如下: call proc08(1001, @o_ename); select @o_ename; 这样,@o_ename变量将保存存储过程返回的员工名字。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL存储过程——输入参(in)、输出参(out)、输入输出参(inout)](https://blog.csdn.net/weixin_47723732/article/details/123582459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值