当前访客身份:游客 [ 登录  | 注册加入尚学堂]
启用新域名sxt.cn
新闻资讯

存储过程之二—变量

helloworld 发表于 2年前  | 评论(0 )| 阅读次数(566 )|   0 人收藏此文章,   我要收藏
 mysql中变量分为局部变量、用户变量、会话变量和全局变量。每种变量的赋值方式,使用方式以及作用范围都不太一样。以下详细介绍这四种类型变量。

一、局部变量

  局部变量一般定义在sql语句块中,如存储过程的的begin/end。作用范围也只在这个语句块中。执行完毕后,就会销毁。局部变量可以使用declare声明,default设置默认值。语法如下:

  DECLARE 变量名称  变量类型 DEFAULT 默认值;

 
DROP PROCEDURE IF EXISTS proc_test_var_loc;
CREATE PROCEDURE proc_test_var_loc( )
BEGIN 
    DECLARE t1 INT DEFAULT 1; -- local的变量
  SET t1 = t1 +1; 
    SELECT t1 ;
END;

CALL proc_test_var_loc();



  每次调用该存储过程的结果都是一样,因为每次执行完该存储过程,变量都会销毁。当第二次执行的时候就会重新初始化。

二、用户变量

  用户变量的作用返回在当前整个连接,当前连接断开后,变量就会销毁。用户变量不需要声明,直接使用set @变量名即可。语法如下:

  set @变量名 = 变量值 

  set @变量名 :=变量值

 
DROP PROCEDURE IF EXISTS proc_test_var_user;
CREATE PROCEDURE proc_test_var_user()
BEGIN   
        SET @var1 = @var1 + 1; -- 变量加一
        SET @var2 := @var2 -1; -- 变量减一
    SELECT @num1:=(@var1) AS sum, @num2:=(@var2) AS dif; -- 查询两个变量的和、差
END;
-- 一下两个语句只需要调用一次
SET @var1 = 1; -- 设置初始值
SET @var2 := 2; -- 设置初始值
CALL proc_test_var_user();



  由于用户变量的作用范围在整个连接,所以在一次连接中,执行完SET @var1 = 1;SET @var2 := 2;一次之后,每次调用CALL proc_test_var_user();的结果都不一样。

 三、会话变量

  会话变量又称为session变量,会话变量的作用范围与用户变量一样,在当前连接。当连接断开后,所有的会话变量都被销毁。

  查看会话变量如下:


select @@autocommit; -- 查看一个会话变量
select @@session.autocommit; -- 查看一个会话变量
show session variables like "%bin%"; -- 查看多个会话变量
show session variables; -- 查看所有会话变量


  设置会话变量如下:


set session autocommit = 1;
set @@session.autocommit = 0;
set autocommit = 1; -- 不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION

四、系统变量

  全局变量不是由用户的程序定义的,而是在服务器级定应义的。当 服务器启动时,将所有全局变量初始化。这些默认值可以在配置文件或在命令行中进行修改的。要想更改全局变量,必须具有超级权限。全局变量作用于服务器的整个生命周期,服务器重新启动后,设置的变量就会失效。要想让全局变量重启后继续生效,需要更改相应的配置文件。引用全局变量时,必须以“@@”开头。局部变量的名称不能与全局变量的名称相同、否则会在应用中出错。
  查看系统变量如下:

select @@global.autocommit; -- 查看某个系统变量
show global variables like "%bin%"; --查看多个系统变量
show global variables;  --查看所有系统变量



  设置系统变量如下:

set global autocommit = 1; -- 注意:此处的global不能省略。根据手册,set命令设置变量时若不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION
set @@global.autocommit = 0;



  我们使用变量时,尽量使用范围小的,这样能尽量减少多次操作直接的影响。

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183