存储过程之二—变量

简介:   mysql中变量分为局部变量、用户变量、会话变量和全局变量。每种变量的赋值方式,使用方式以及作用范围都不太一样。以下详细介绍这四种类型变量。 一、局部变量   局部变量一般定义在sql语句块中,如存储过程的的begin/end。

  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;

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

目录
相关文章
|
7月前
|
存储 SQL 关系型数据库
MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)
MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)
562 0
|
7月前
|
存储 关系型数据库 MySQL
Mysql存储过程查询结果赋值到变量
Mysql存储过程查询结果赋值到变量
164 0
|
8月前
|
存储 SQL 关系型数据库
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
107 0
|
存储 关系型数据库 MySQL
MySQL基础篇——存储过程和函数中的变量
MySQL基础篇——存储过程和函数中的变量
130 0
|
存储 SQL 安全
15天学习MySQL计划-存储过程变量判断循环游标函数触发器(进阶篇)-第九天(下)
15天学习MySQL计划-存储过程变量判断循环游标函数触发器(进阶篇)-第九天
154 0
|
存储 SQL 关系型数据库
15天学习MySQL计划-存储过程变量判断循环游标函数触发器(进阶篇)-第九天(上)
15天学习MySQL计划-存储过程变量判断循环游标函数触发器(进阶篇)-第九天
141 0
|
存储 SQL 安全
SQL 存储过程和函数的对比、变量、条件和处理程序、游标、流程控制详解+代码示例
SQL 存储过程和函数的对比、变量、条件和处理程序、游标、流程控制详解+代码示例
|
存储 SQL Perl
PostgreSQL plpgsql 存储过程、函数 - 状态、异常变量打印、异常捕获... - GET [STACKED] DIAGNOSTICS
标签 PostgreSQL , GET , STACKED , DIAGNOSTICS 背景 使用GET STACKED DIAGNOSTICS捕获异常时的STACK内容。 使用GET DIAGNOSTICS捕获运行过程中的状态值。
4663 0