mysql 会话变量 if 报错_mysql的高级进阶(一)

我们将我们的客户端的编码设置为utf8,客户端和客户端连接设为utf8,表设计为utf8,字段设置成utf8。

如果我们的客户端是gbk的编码,那我们就通知mysql服务器客户端和客户端连接是gbk的就行了。这样也不会出现乱码。

会话变量和全局变量

查看会话变量

show session variables [like ‘%关键字%‘]

查看字段的变量名称select @@session.变量名称。

指定会话变量的值 set @@session.变量名称=值 也可以使用set 变量名称=值

全局变量

全局变量一旦设置在所有的客户端都有效。

查看全局变量

show global variables [like ‘%关键字%‘]

select @@global.变量名称

指定全局变量的值 set global 变量名称=值 set @@global.变量名称=变量值。

用户定义变量 set @变量名称=值;比如set name=‘张三‘

存储过程

存储过程是为了完成特定功能的sql语句集,经过编译后存储在数据库中,用户通过指定存储过程的名称并给定参数来调用并执行他。有点类似于自定义函数。

优点:

1增强了sql语言的功能和流程性,我们可以完成复杂的判断和运算

2存储过程创建完成后,可以多次被调用。

3 存储过程能实现较快的执行速度,如果一个操作包含大量的事务,那么存储过程速度要快很多,因为存储过程是预编译的,首次运行mysql的优化器会对其进行优化,而批量处理事务每次都要进行编译和优化,速度相对慢一些。

4 能减少网络的流量,因为发送的数据少。

5 存储过程相对来说安全。

存储过程的存储步骤

1 首先选中一个数据库,存储过程是放在某个数据库下的。use 数据库;

2 改变分割符,不要让;作为执行结束的标记 使用:delimiter $$ 将$$作为sql语句执行的结束符。

3 创建一个存储过程

create procedure 名称()

begin

sql语句;

sql语句;

end

$$

4 恢复语句执行的分割符delimiter ;

5 执行存储过程 call 名称[(参数1,参数2,...)];

以上是存储过程的基本用法,当然存储过程是复杂的,接下来我们通过细节讲解来学习存储过程。

我们可以在存储过程中定义局部变量,定义局部变量可以使用:

declare 变量名称 类型(长度),比如:

create procedure 名称()

begin

declare name varchar(20) default ‘‘;

select name;

end

$$

调用:call 名称;

我们也能使用

create procedure 名称()

begin

declare stu_no int;

set stu_no=10;

select stu_no;

end

$$;

调用: call 名称;

我们在创建存储过程时可以传递参数。

参数的类型:

IN:输入参数,表示该参数的值必须在调用存储过程之前指定,在存储过程中修改的值不能被返回。

create procedure 名称(IN number int)

begin

select number;

set number=number+1;

select number;

end

$$;

delimiter ;

set @number=3;

call 名称(@number)

b1a0a3fa1feda2140a0874a785d44333.png

我们在重新查询number的值

select @number 我们发现number的值还是3,并没有发生什么改变,由此可见IN类型的参数在执行完存储过程后他的值并不会发生任何变化,有点类似php的局部变量。

OUT:输出参数,该值可以在存储过程内部改变,并且可以返回,往往是用于获取存储过程里的参数值。

341b5f4dff122b42b3c0a30bb5de73f7.png

ba2d0e28e4bc384df6bd1ebe459316a9.png

当我们传进入一个变量值是存储过程不认识,在重新赋值后就会有值了。

INOUT:输入输出参数,该值可以在调用时指定,并可修改和返回,是in和out的综合使用。

8c92711e4f0f11f99091adec2ae4a483.png

c2baa5536a208c73ba35ec866d943365.png

mysql中流程控制语句之选择语句

if分支

IF condition1 THEN

要执行的语句;

ELSEIF condition2 THEN

要执行的语句;

ELSE

要执行的语句;

ENDIF

和存储过程结合

create procedure showage(in age int)

begin

if age>18 then

select "成年人";

else

select "未成年人";

end if;

end

$$

set @age=19;

call showage(@age);

case分支

CASE case_value

WHEN when_value THEN

要执行的语句;

[WHEN when_value THEN 要执行的语句]

[ELSE 要执行的语句]

END CASE

其中case_value参数表示条件判断变量,when_value 表示变量取值。

create procedure addsalary(IN emno int)

begin

declare add int;

case emno

when 1001 then

set add=100;

when 1002 then

set add=200;

when 1003 then

set add=300;

else

set add=500;

end case;

update salary set money=money+add where emno=emno;

end;

$$

存储过程的使用。

set @emno=1002;

call addsalary(emno);

我们也可以把控制流程写到sql语句中

979aa0d6b48978d577704f8af2c194ee.png

ifnull函数的使用,ifnull(exp1,exp2) 如果exp1为空值,那么返回的结果是exp2,如果exp1不为空,返回的结果就是exp1。

e7ab677d600ac6a1bd5a3268ab28138e.png

mysql中流程控制语句之循环语句

while语句

create procedure addnum()

begin

declare i int default 1;

declare sum int default 0;

while i < 100 do

set sum=sum+i;

set i=i+1;

end while

select sum;

end;

$$;

调用:call addnum

repeat .....until

create procedure updateGender()

begin

declare imin int default 1;

declare imax int default 1;

select min(emp_no) into imin from employees;

select max(emp_no) into imax from employees;

repeat

if imin % 2=0 then

update employees set gender=‘F‘ where emp_no=imin;

end if;

set imin=imin+1;

until imin >imax;

end repeat;

end;

$$

loop....end loop

create procedure updateHire()

begin

declare imin int default 1;

declare imax int default 1;

select min(emp_no) into imin from employees;

select max(emp_no) into imax from employees;

myloop:loop

if imin % 2=0 then

update employees set hire_date=‘1999-12-11‘ where emp_no=imin;

end if;

set imin=imin+1;

if imin > imax then

leave myloop;

end if;

end loop;

end;

$$

mysql中存储过程中捕获错误和处理

0edd54c6a3bf5cc234c6036d8a83c4ed.png

如果这样写存储过程,会报错。我们可以捕获这个错误。

22174f34654f4c9da7f7dc771924a655.png

存储过程的管理

show procedure status where db="库名";显示我们的数据库下有那些存储过程。

查看数据库下存储过程的列表

use 数据库

select specific_name from mysql.proc;

查看存储过程的创建过程

show create procedure 名称

select specifie_name,body from mysql.proc where specific_name="名称";

删除存储过程

drop procedure if exists 名称

存储函数

首先查看是否已经开启了创建函数的功能

show variables like "%fun%";

如果值为off,那么需要开启

set global log_bin_trust_function_creators=1;

创建函数的语法

create function 函数名称(变量1,变量2)

returns 数据类型

begin

执行的程序的代码

return 数据;

end;

求两个数的和

1ce9a32f8fe71115289d50b40b846ae9.png

可以通过show create function 函数名称 可以看见创建的代码。

可以通过drop function if exists 函数名称;

下面的这个函数可以判断用户输入用户名称和密码是否登录成功。

4804125b61cee4b864aba139356e7bed.png

存储函数和存储过程的区别

我们的存储函数必须要有返回值。

原文:https://blog.51cto.com/5493817/2504817

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值