mysql 复制存储过程,Mysql:存储过程

变量

系统变量

变量由系统提供,不是用户定义,属于服务器层面

全局变量

查看所有的全局系统变量:

SHOW GLOBAL VARIABLES

Variable_name Value

​--------------------------------------- ----------------------------------------------------------------​

auto_increment_increment1auto_increment_offset1automatic_sp_privileges ON

back_log50basedir D:\Program Files (x86)\mysql\

binlog_cache_size32768bulk_insert_buffer_size8388608character_set_client utf8

character_set_connection utf8

character_set_database utf8

character_set_filesystem binary

character_set_results utf8

查看指定的全局变量

例如查看隔离级别:

SELECT @@tx_isolation

@@tx_isolation-----------------REPEATABLE-READ

全局变量修改后,其他的连接的变量的值也会改变

作用域:服务器每次启动将为所有的全局变量赋初始值,针对于所有的会话(连接)有效,但不能跨重启(配置文件内的除外)

会话变量

作用域:仅仅针对于当前会话(连接)有效

查看会话变量

SHOW SESSION VARIABLES

Variable_name Value

​--------------------------------------- ----------------------------------------------------------------​

auto_increment_increment1auto_increment_offset1automatic_sp_privileges ON

back_log50basedir D:\Program Files (x86)\mysql\

binlog_cache_size32768bulk_insert_buffer_size8388608character_set_client utf8

character_set_connection utf8

character_set_database utf8

character_set_filesystem binary

自定义变量

用户变量

作用域

针对于当前会话有效,与会话变量的作用域有效

声明

声明时必须初始化,格式是 :

set @变量名=值;或set @变量名:=值;或select @变量名:=值

赋值

方式一:

set @变量名=值;或set @变量名:=值;或select @变量名:=值

方式二:

select字段 into 变量名from 表名

SELECT COUNT(1) INTO @studentNumber

FROM student

使用(查看用户变量的值)

SELECT @studentNumber

局部变量

作用域

仅仅在定义它的begin end中有效,且只能放在begin end中的第一句话

声明

declare 变量名 类型;

declare 变量名 类型default 值(声明变量的同时进行赋值)

赋值

set 变量名=值;或set 变量名:=值;或select @变量名:=值select字段 into 变量名from 表名

使用

select 局部变量名

案例

用户变量

声明两个变量并赋初始值,求和

SET @a=1;

SET @b=2;

SET @sum= @a+@b;

SELECT @sum;

结果

@sum--------

3

存储过程和函数

含义

一组预编译好的SQL语句的集合

好处

提高代码的可重用性

简化操作

减少了编译次数和数据库服务器的连接次数,提高了效率

创建

创建语法

create procedure 存储过程名(参数列表)

begin

存储过程体

end

参数列表

参数模式参数名参数类型

参数模式

IN:该参数作为输入,需要调用方传入值1

OUT:该参数作为输出,可以作为返回值

INOUT:该参数既可以作为输入也可以作为输出,既可以输入值也可以返回值

调用语法

CALL存储过程名(实参列表)

注意事项

如果存储过程体只有一句话,begin end可省略

存储过程体中的每条SQL语句的结尾必须加分号

存储过程的结尾可以使用 DELIMITER重新设置

案例

无参

进入docker容器mysql窗口并登录,将书写的存储过程语句粘贴进去运行,运行成功后可以在可视化工具中看到存储过程

delimiter $

create procedure myInsert()

begin

insert into student (birthday,classno,phone,sex,sname,score) values

('1998-11-11','202001','18739396145','nv','tom',501.0),

('1998-11-11','202001','18739490123','nan','jack',503.0);

end $

调用存储过程

call myInsert()$

执行查询语句

| 2020043105 | 1998-11-11 | 202001 | 18739396145 | nv | tom | 501 |

| 2020043106 | 1998-11-11 | 202001 | 18739490123 | na | jack | 503 |

+------------+------------+---------+-------------+------+-----------+-------+

有输入参数

案例一

delimiter $

create procedure snameIn(IN name varchar(8))

beginselect sname,score.*

fromstudent

left join score on student.studentno=score.studentnowhere student.sname=name;

end $

调用存储过程

call snameIn('王石')$

202011141423243251sal5ohi918vmqs_0.png

案例二

DELIMITER $

CREATE PROCEDURE login(IN username VARCHAR(12),IN passwd VARCHAR(6))

BEGIN

DECLARE result INT DEFAULT0;

SELECT COUNT(*) INTO result

FROM login

WHERE login.account=username

AND login.password=passwd;

SELECT IF(result>0,'成功','失败');

END $

202011141423243251sal5ohi918vmqs_3.png

有输出参数

返回一个字段的值

DELIMITER $

CREATE PROCEDURE shuchu(IN NAME VARCHAR(8),OUT finall DOUBLE)

BEGIN

SELECT score.finall INTO finall

FROM student

LEFT JOIN score ON student.studentno=score.studentno

WHERE student.sname=NAME;

END $

CALL shuchu('zhai',@fin)$

SELECT @fin$

202011141423243251sal5ohi918vmqs_1.png

返回多个字段的值

需要注意一个问题:下面的书写select并分别给两个输出参数赋值的写法是不对的

DELIMITER $

CREATE PROCEDURE outputTwo(IN NAME VARCHAR(8),OUT finall DOUBLE,OUT usually DOUBLE)

BEGIN

SELECT score.finall INTO finall,score.usually INTO usually

FROM student

LEFT JOIN score ON student.studentno=score.studentno

WHERE student.sname=NAME;

END $

需要将两个赋值语句合并为一次赋值

DELIMITER $

CREATE PROCEDURE outputTwo(IN NAME VARCHAR(8),OUT finall DOUBLE,OUT usually DOUBLE)

BEGIN

SELECT score.finall,score.usually INTO finall,usually

FROM student

LEFT JOIN score ON student.studentno=score.studentno

WHERE student.sname=NAME;

END $

先调用:

202011141423243251sal5ohi918vmqs_5.png

查看结果:

202011141423243251sal5ohi918vmqs_2.png

INOUT模式

CREATE PROCEDURE inouttest(INOUT a INT,INOUT b INT)

BEGIN

SET a=a*2;

SET b=b*2;

END $

202011141423243251sal5ohi918vmqs_4.png

删除

存储过程的删除

drop procedure 存储过程名$

查看

查看存储过程信息

SHOW CREATE PROCEDURE 存储过程名称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值