mysql中各类变量赋值的定义和使用

 2024-01-27 05:02:37  阅读 0

第1节

特别注意:存储过程中,定义变量的地方,先定义变量,最后定义@,否则会报错! ! [mysql]

游标中的数据只能存储在变量中! ! [mysql]

在MySQL存储过程中,有两种定义变量的方法:

1、使用set或直接赋值,变量名以@开头。

例如:设置@var=1;

可以在会话中的任何位置声明,作用域是整个会话,称为用户变量。

2、用关键字声明的变量只能在存储过程(包括游标)中使用,称为存储过程变量,例如:

0;

主要用在存储过程中,或者向存储传递参数时。

两者的区别在于:

调用存储过程时,用 上次计算的结果声明的变量相当于本次会话中的全局变量。

主要内容

1. 局部变量

2. 用户变量

3. 会话变量

4. 全局变量

会话变量和全局变量称为系统变量。

1. 局部变量。仅在当前开始/结束代码块中有效

局部变量一般用在SQL语句块中,例如存储过程的begin/end。 其范围仅限于语句块。 语句块执行完毕后,局部变量就消失了。 语句专门用于定义局部变量,可用于指定默认值。 set语句设置不同类型的变量,包括会话变量和全局变量。

局部变量定义语法形式

DECLARE var_name [, var_name]... data_type [ DEFAULT value ];

例如,在begin/end语句块中添加以下语句,接收函数传入的a/b变量,将它们相加,并通过set语句将值赋给c变量。

set语句的语法形式为SET=expr[,=expr]...; set语句不仅可以用于给局部变量赋值,还可以用于对用户变量进行声明和赋值。

DECLARE c int DEFAULT 0;
SET c=a+b; #赋值,必须要有SET
SELECT c AS C;

或者以….into…的形式赋值

select into 语句句式:SELECT col_name[,...] INTO var_name[,...] table_expr [WHERE...];#很有用

例子

DECLARE v_employee_name VARCHAR(100);
DECLARE v_employee_salary DECIMAL(8,4);
SELECT employee_name, employee_salary
INTO v_employee_name, v_employee_salary
FROM employees
WHERE employee_id=1;

2. 用户变量 用户变量在客户端连接数据库实例的整个过程中都有效。

mysql中的用户变量不需要提前声明。 使用它们时只需使用“@变量名称”即可。

第一种用法:set @num=1; 或者set @num:=1;//这里需要使用set语句创建并初始化变量,直接使用@num变量。

第二种用法:@num:=1; 或 @num:=表名中的字段名,其中...,

语句一般用于输出用户变量,如@变量名,用于输出数据源非表的数据。对于局部变量(不带@)无效,应使用into形式代替

注意上面两个赋值符号。 使用set时可以使用“=”或“:=”,但使用set时必须使用“:=赋值”。

@是的/博客//97/

用户变量与数据库连接相关。 在存储过程中创建用户变量后,连接中声明的变量将消失,直到数据库实例断开连接。

在此连接中声明的变量不能在另一个连接中使用。

用户变量的变量名采用@的形式。

名称必须以@开头。

声明变量时,需要使用set语句。 例如,以下语句声明一个名为@a 的变量。

设置@a=1;

声明一个名为@a的变量,并赋值为1。mysql中变量的数据类型没有严格限制。 它的数据类型随时根据您分配给它的值而变化。 (SQL使用语句来声明变量,数据类型受到严格限制。)

我们还可以使用语句给变量赋值。

例如:

set @name = '';
select @name:=password from user limit 0,1;#从数据表中获取一条记录password字段的值给@name变量。在执行后输出到查询结果集上面。

(注意等号前面有一个冒号,后面的limit 0和1是用来限制返回结果的,也就是说可以是0也可以是1,相当于SQL中的top 1)

如果直接写:@name:= from user;

如果此查询返回多个值,则@name变量的值将是最后一条记录的字段值。

用户变量可以应用于整个当前连接,但是当当前连接断开时,其定义的用户变量将会消失。

用户变量的使用如下(我们不需要使用关键字来定义用户变量,直接使用即可); 定义时,变量名必须以@开头:

#定义
select @变量名  或者 select @变量名:= 字段名 from 表名 where 过滤语句;
set @变量名;
#赋值 @num为变量名,value为值
set @num=value;select @num:=value;

给用户变量赋值有两种方法,一种是直接使用“=”符号,另一种是使用“:=”符号。 不同的是,使用set命令给用户变量赋值时,两种方法都可以使用; 使用语句给用户变量赋值时,只能使用“:=”方法,因为在语句中,“=”符号语句是专门用来定义局部变量的。 set语句设置不同类型的变量,包括会话变量和全局变量。

例如
BEGIN
#Routine body goes here...
#SELECT c AS c;
DECLARE c int DEFAULT 0;
SET @var1=143;  #定义一个用户变量,并初始化为143
SET @var2=34;
SET c=a+b;
SET @d=c;
SELECT @sum:=(@var1+@var2) AS sum, @dif:=(@var1-@var2) AS dif, @d AS C;#使用用户变量。@var1表示变量名
SET c=100;
SELECT c AS CA;
END
在查询中执行下面语句段
CALL `order`(12,13);  #执行上面定义的存储过程
SELECT @var1;  #看定义的用户变量在存储过程执行完后,是否还可以输出,结果是可以输出用户变量@var1,@var2两个变量的。
SELECT @var2;

执行order存储过程后,存储过程中新创建的var1和var2用户变量仍然可以使用语句输出,但无法识别存储过程中定义的局部变量c。

@是的/博客//97/

系统变量:

系统变量分为全局变量和会话变量。

全局变量在MYSQL启动时会被服务器自动初始化为默认值。 可以通过更改 my.ini 文件来更改这些默认值。

每次建立新连接时,MYSQL 都会初始化会话变量。 MYSQL会复制当前所有全局变量的值。 作为会话变量。

(换句话说,如果会话建立后不手动更改会话变量和全局变量的值,则所有这些变量的值将是相同的。)

全局变量和会话变量的区别在于,全局变量的修改会影响整个服务器,而会话变量的修改只会影响当前会话。

(即当前数据库连接)。

我们可以用

 SHOW SESSION VARIABLES;

输出所有会话变量的语句:

(可以简写为show,如果不指定是输出全局变量还是会话变量,则默认输出会话变量。)如果要输出所有全局变量:

SHOW GLOBAL VARIABLES

有些系统变量的值可以使用语句动态改变,但有些系统变量的值是只读的。

对于那些可以改变的系统变量,我们可以使用set语句来进行改变。

系统变量变量名前面有两个@;

如果要更改会话变量的值,请使用以下语句:

set session varname = value;
或者
set @@session.varname = value;

例如:

mysql> set session sort_buffer_size = 40000;
  Query OK, 0 rows affected(0.00 sec)
用select @@sort_buffer_size;输出看更改后的值是什么。
  如果想要更改全局变量的值,将session改成global:
  set global sort_buffer_size = 40000;
  set @@global.sort_buffer_size = 40000;

但是,如果要更改全局变量的值,则需要 SUPER 权限。

(注意ROOT只是一个内置账户,并不是权限。这个账户拥有MYSQL数据库中的所有权限。任何账户只要拥有名为SUPER的权限就可以改变全局变量的值,就像任何用户都可以只要有 FILE 权限就可以调用、进入、加载数据。)

使用语句我们可以查询单个会话变量或全局变量的值:

select @@session.sort_buffer_size
select @@global.sort_buffer_size
select @@global.tmpdir

上面提到的所有内容都可以用 local 关键字替换。

例如:

select @@local.sort_buffer_size
localsession的近义词。

无论设置系统变量还是查询系统变量值,只要不指定是全局变量还是会话变量即可。 所有这些都被视为会话变量。

例如:

设置@@ = 50000;

@@;

以上均未指定是或否,因此所有内容均按此处理。

3. 会话变量

服务器为每个连接的客户端维护一系列会话变量。 当客户端连接到数据库实例时,客户端的会话变量将使用相应全局变量的当前值进行初始化。 设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其他客户端的会话变量。 会话变量与用户变量具有相同的作用域,仅限于当前连接。 当当前连接断开时,其设置的所有会话变量都将失效。

设置会话变量和更改会话变量值的方法有以下三种:

set session var_name = value;
set @@session.var_name = value;
set var_name = value;  #缺省session关键字默认认为是session
查看所有的会话变量
SHOW  SESSION VARIABLES;

查看一个会话变量也有如下三种方式:
select @@var_name;
select @@session.var_name;
show session variables like "%var%";

上面提到的所有内容都可以用 local 关键字替换。

例如:

@@当地的。

本地是的同义词。

4. 全局变量

全局变量影响服务器的整体运行。 当服务器启动时,它将所有全局变量初始化为其默认值。 这些默认值可以在选项文件中或通过命令行上指定的选项进行更改。 要更改全局变量,您必须具有 SUPER 权限。 全局变量适用于整个生命周期,但不能跨越重启。 即所有设置的全局变量在重启后都会失效。 要使全局变量在重启后继续生效,需要更改相应的配置文件。

设置全局变量有两种方法:

设置=值; //注意:这个不能省略。根据手册,如果用set命令设置变量时不指定或LOCAL,则默认使用。

放 @@。 = 值; //同上

查看所有全局变量

展示 ;

查看全局变量有两种方法:

@@。;

显示如“%var%”;

标签: 变量 会话 全局

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码