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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6395 | 回復(fù): 8
打印 上一主題 下一主題

【已解決】存儲過程中的用戶變量和局部變量到底什么區(qū)別? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-10-29 10:34 |只看該作者 |倒序瀏覽
本帖最后由 chinafenghao 于 2013-10-30 13:58 編輯

發(fā)現(xiàn)在存儲過程中用prepare語句是不能使用局部變量的,這到底是為啥,mysql出于什么目的設(shè)計了用戶變量?它和局部變量的區(qū)別在哪里

論壇徽章:
8
CU大;照
日期:2013-09-18 15:20:48CU大;照
日期:2013-09-18 15:20:58CU大;照
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大;照
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
2 [報告]
發(fā)表于 2013-10-30 13:58 |只看該作者
一、局部變量。
局部變量一般用在sql語句塊中,比如存儲過程的begin/end。其作用域僅限于該語句塊,在該語句塊執(zhí)行完畢后,局部變量就消失了。
局部變量一般用declare來聲明,可以使用default來說明默認(rèn)值。
例如在存儲過程中定義局部變量:
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;

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

二、用戶變量。
用戶變量的作用域要比局部變量要廣。用戶變量可以作用于當(dāng)前整個連接,但是當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會消失。
用戶變量使用如下的方式定義:
    @變量名
對用戶變量賦值有兩種方式,一種是直接用"="號,另一種是用":="號。其區(qū)別在于使用set命令對用戶變量進行賦值時,兩種方式都可以使用;當(dāng)使用select語句對用戶變量進行賦值時,只能使用":="方式,因為在select語句中,"="號被看作是比較操作符。
示例程序如下:
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

論壇徽章:
1
綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00
3 [報告]
發(fā)表于 2013-10-31 06:48 |只看該作者
這句錯了:'用戶變量可以作用于當(dāng)前整個連接,但是當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會消失。'

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

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

論壇徽章:
2
酉雞
日期:2014-02-19 09:11:08摩羯座
日期:2014-05-23 10:16:16
4 [報告]
發(fā)表于 2013-10-31 09:05 |只看該作者
2樓3樓學(xué)習(xí)了

論壇徽章:
0
5 [報告]
發(fā)表于 2013-11-01 14:13 |只看該作者
fly3ds 發(fā)表于 2013-10-31 06:48
這句錯了:'用戶變量可以作用于當(dāng)前整個連接,但是當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會消失。'

事 ...

我有一個問題,如果用戶變量的作用域如此大的話,那么它是怎么避免變量名污染這個問題的,假設(shè)一個用戶連接在此次連接調(diào)用了兩個存儲過程,兩個存儲過程中有同名的用戶變量,這會引發(fā)類似線程安全問題嗎

論壇徽章:
1
綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00
6 [報告]
發(fā)表于 2013-11-01 14:19 |只看該作者
本帖最后由 fly3ds 于 2013-11-01 14:23 編輯

回復(fù) 5# abcbuzhiming

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

     或者你盡可能用局部變量。

論壇徽章:
0
7 [報告]
發(fā)表于 2013-11-01 14:29 |只看該作者
fly3ds 發(fā)表于 2013-11-01 14:19
回復(fù) 5# abcbuzhiming

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

要能用我早就用局部變量了,問題是prepare語句壓根就不支持局部變量

論壇徽章:
1
綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00
8 [報告]
發(fā)表于 2013-11-01 14:37 |只看該作者
回復(fù) 7# abcbuzhiming


    你沒看見二樓文章里的declare c嘛?試試看。

論壇徽章:
0
9 [報告]
發(fā)表于 2013-11-02 12:09 |只看該作者
fly3ds 發(fā)表于 2013-11-01 14:37
回復(fù) 7# abcbuzhiming

局部變量不能用于prepare語句,尤其不能用于參數(shù)。我早就試過了
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP