1. 程式人生 > >mysql的set和declare定義變數的區別

mysql的set和declare定義變數的區別

1. 型別宣告
set 不需要宣告型別,declare必須指定型別


2. 位置
set 位置可以任意, declare 必須在複合語句的開頭,在任何其它語句之前


3.作用範圍
DECLARE 定義的變數的作用範圍是BEGIN … END塊內,只能在塊中使用。
SET 定義的變數使用者變數,作用範圍是會話/全域性
    如SET @var=12的定義,則var的作用域為整個會話,為會話變數.

    如SET global var=12的定義,則var的作用域為全域性,為全域性變數.

源自: http://blog.sina.com.cn/s/blog_ad0672d60102ux0e.html

------------------------------------------------------------------------------------------------------------------------------------------------

MySQL儲存過程中,定義變數有兩種方式:
1.使用set或select直接賦值,變數名以 @ 開頭.
例如:set @var=1;
可以在一個會話的任何地方宣告,作用域是整個會話,稱為會話變數

2.以 DECLARE 關鍵字宣告的變數,只能在儲存過程中使用,稱為儲存過程變數,例如:
DECLARE var1  INT DEFAULT 0;  
主要用在儲存過程中,或者是給儲存傳引數中。

兩者的區別是:
在呼叫儲存過程時,以DECLARE宣告的變數都會被初始化為 NULL。而會話變數(即@開頭的變數)則不會被再初始化,在一個會話內,只須初始化一次,之後在會話內都是對上一次計算的結果,就相當於在是這個會話內的全域性變數。

在儲存過程中,使用動態語句,預處理時,動態內容必須賦給一個會話變數。
例:
set @v_sql= sqltext;
PREPARE stmt FROM @v_sql;  
EXECUTE stmt;     
DEALLOCATE PREPARE stmt;

源自: http://blog.csdn.net/seteor/article/details/17682551