亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 【已解決】存儲(chǔ)過程中的用戶變量和局部變量到底什么區(qū)別? [打印本頁]

作者: abcbuzhiming    時(shí)間: 2013-10-29 10:34
標(biāo)題: 【已解決】存儲(chǔ)過程中的用戶變量和局部變量到底什么區(qū)別?
本帖最后由 chinafenghao 于 2013-10-30 13:58 編輯

發(fā)現(xiàn)在存儲(chǔ)過程中用prepare語句是不能使用局部變量的,這到底是為啥,mysql出于什么目的設(shè)計(jì)了用戶變量?它和局部變量的區(qū)別在哪里
作者: chinafenghao    時(shí)間: 2013-10-30 13:58
一、局部變量。
局部變量一般用在sql語句塊中,比如存儲(chǔ)過程的begin/end。其作用域僅限于該語句塊,在該語句塊執(zhí)行完畢后,局部變量就消失了。
局部變量一般用declare來聲明,可以使用default來說明默認(rèn)值。
例如在存儲(chǔ)過程中定義局部變量:
drop procedure if exists add;
create procedure add
(
    in a int,
    in b int
)
begin
    declare c int default 0;
    set c = a + b;
    select c as c;
end;

在上述存儲(chǔ)過程中定義的變量c就是局部變量

二、用戶變量。
用戶變量的作用域要比局部變量要廣。用戶變量可以作用于當(dāng)前整個(gè)連接,但是當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會(huì)消失。
用戶變量使用如下的方式定義:
    @變量名
對(duì)用戶變量賦值有兩種方式,一種是直接用"="號(hào),另一種是用":="號(hào)。其區(qū)別在于使用set命令對(duì)用戶變量進(jìn)行賦值時(shí),兩種方式都可以使用;當(dāng)使用select語句對(duì)用戶變量進(jìn)行賦值時(shí),只能使用":="方式,因?yàn)樵趕elect語句中,"="號(hào)被看作是比較操作符。
示例程序如下:
drop procedure if exists math;
create procedure math
(
    in a int,
    in b int
)
begin
    set @var1 = 1;
    set @var2 = 2;
    select @sum:=(a + b) as sum, @dif:=(a - b) as dif;
end;

mysql> call math(3, 4);
+------+------+
| sum  | dif  |
+------+------+
|    7 |   -1 |
+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @var1; //var1為用戶變量
+-------+
| @var1 |
+-------+
| 1     |
+-------+
1 row in set (0.00 sec)

mysql> select @var2; //var2為用戶變量
+-------+
| @var2 |
+-------+
| 2     |
+-------+
1 row in set (0.00 sec)

@abcbuzhiming
作者: fly3ds    時(shí)間: 2013-10-31 06:48
這句錯(cuò)了:'用戶變量可以作用于當(dāng)前整個(gè)連接,但是當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會(huì)消失。'

事實(shí)是,當(dāng)前連接斷開后,@var1 @var2 以及math過程都被存儲(chǔ)起來;再次連上后,可以直接call math(3, 4);select @var1;select @var2;

我猜測(cè)是當(dāng)mysqld進(jìn)程退出后,這些存儲(chǔ)過程和變量才會(huì)消失,需要重新定義。


作者: tiankafeiwu    時(shí)間: 2013-10-31 09:05
2樓3樓學(xué)習(xí)了
作者: abcbuzhiming    時(shí)間: 2013-11-01 14:13
fly3ds 發(fā)表于 2013-10-31 06:48
這句錯(cuò)了:'用戶變量可以作用于當(dāng)前整個(gè)連接,但是當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會(huì)消失。'

事 ...

我有一個(gè)問題,如果用戶變量的作用域如此大的話,那么它是怎么避免變量名污染這個(gè)問題的,假設(shè)一個(gè)用戶連接在此次連接調(diào)用了兩個(gè)存儲(chǔ)過程,兩個(gè)存儲(chǔ)過程中有同名的用戶變量,這會(huì)引發(fā)類似線程安全問題嗎
作者: fly3ds    時(shí)間: 2013-11-01 14:19
本帖最后由 fly3ds 于 2013-11-01 14:23 編輯

回復(fù) 5# abcbuzhiming

      編寫存儲(chǔ)過程的人要自己避免。如果你學(xué)過或者做一些程序設(shè)計(jì),會(huì)發(fā)現(xiàn)在任何程序設(shè)計(jì)環(huán)境里都是這樣,需要自己避免變量名重復(fù),函數(shù)名重復(fù)的問題,如果重復(fù)了編譯器會(huì)報(bào)錯(cuò)。MySQL報(bào)不報(bào)錯(cuò)我就沒試過了。

     或者你盡可能用局部變量。
作者: abcbuzhiming    時(shí)間: 2013-11-01 14:29
fly3ds 發(fā)表于 2013-11-01 14:19
回復(fù) 5# abcbuzhiming

      編寫存儲(chǔ)過程的人要自己避免。如果你學(xué)過或者做一些程序設(shè)計(jì),會(huì)發(fā)現(xiàn)在任何 ...

要能用我早就用局部變量了,問題是prepare語句壓根就不支持局部變量
作者: fly3ds    時(shí)間: 2013-11-01 14:37
回復(fù) 7# abcbuzhiming


    你沒看見二樓文章里的declare c嘛?試試看。
作者: abcbuzhiming    時(shí)間: 2013-11-02 12:09
fly3ds 發(fā)表于 2013-11-01 14:37
回復(fù) 7# abcbuzhiming

局部變量不能用于prepare語句,尤其不能用于參數(shù)。我早就試過了




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2