zoukankan      html  css  js  c++  java
  • 存储过程之二—变量

      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;

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

  • 相关阅读:
    IoC容器设计
    乐观锁(Optimistic Lock)
    file,path,uri互相转换
    QGraphicsView的paintEvent双缓存绘画
    简单的串口通信程序控制光源
    Qt--QMdiArea和QMdiSubWindow的基本用法
    Qt--支持鼠标拖动来移动内容的QScrollArea视窗
    快速排序算法记录
    结构体在内存中的对齐规则
    求N个数的数组中第K大的数的值
  • 原文地址:https://www.cnblogs.com/always-online/p/3917051.html
Copyright © 2011-2022 走看看