存儲過程之二—變量


  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;

  我們使用變量時,盡量使用范圍小的,這樣能盡量減少多次操作直接的影響。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM