Mysql存儲過程查詢結(jié)果賦值到變量的方法
為阿巴嘎等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及阿巴嘎網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、成都做網(wǎng)站、阿巴嘎網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
把查詢結(jié)果賦值到變量,大部分情況下使用游標(biāo)來完成,但是如果明確知道查詢結(jié)果只有一行(例如統(tǒng)計記錄的數(shù)量,某個字段求和等),其實可以使用set或into的方式來實現(xiàn)賦值。示例代碼:
drop table if exists test_tbl;
create table test_tbl (name varchar(20), status int(2));
insert into test_tbl values('abc', 1),('edf', 2),('xyz', 3);
drop procedure IF EXISTS pro_test_3;
delimiter //
create procedure pro_test_3()
begin
DECLARE cnt INT DEFAULT 0;
select count(*) into cnt from test_tbl;
select cnt;
-- 多個列的情況下似乎只能用 into 方式
select max(status), avg(status) into @max, @avg from test_tbl;
select @max, @avg;
end
delimiter ;
call pro_test_3();
sprintf(query, "SELECT *FROM history WHERE serialnumber='%s' AND adtcode='%s' LIMIT 1;", dataStr,modulename);
if (!mysql_real_query(mysql, query, (unsigned long)strlen(query))) {
res = mysql_use_result(mysql);
numfields = mysql_field_count(mysql);
while (row=mysql_fetch_row(res)) {
fprintf(outfile, "\r\n");
lengths = mysql_fetch_lengths(res);
fields=mysql_fetch_fields(res);
for (i=0; inumfields; i++) {
fprintf(outfile, "%.*s ", (int)lengths[i], row[i]);
}
}
一、局部變量
局部變量一般用在sql語句塊中,比如存儲過程的begin/end。其作用域僅限于該語句塊,在該語句塊執(zhí)行完畢后,局部變量就消失了。
局部變量一般用declare來聲明,可以使用default來說明默認(rèn)值。
二、用戶變量
用戶變量的作用域要比局部變量要廣。用戶變量可以作用于當(dāng)前整個連接,但是當(dāng)當(dāng)前連接斷開后,其所定義的用戶變量都會消失。
用戶變量使用如下(這里我們無須使用declare關(guān)鍵字進(jìn)行定義,可以直接這樣使用):
select @變量名
對用戶變量賦值有兩種方式,一種是直接用"="號,另一種是用":="號。其區(qū)別在于使用set命令對用戶變量進(jìn)行賦值時,兩種方式都可以使用;當(dāng)使用select語句對用戶變量進(jìn)行賦值時,只能使用":="方式,因為在select語句中,"="號被看作是比較操作符。
用select...into語句
下面是mysql 5.0的幫助文檔的:
這個SELECT語法把選定的列直接存儲到變量。因此,只有單一的行可以被取回。
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
注意,用戶變量名在MySQL 5.1中是對大小寫不敏感的。請參閱9.3節(jié),“用戶變量”。
重要: SQL變量名不能和列名一樣。如果SELECT ... INTO這樣的SQL語句包含一個對列的參考,并包含一個與列相同名字的局部變量,MySQL當(dāng)前把參考解釋為一個變量的名字。例如,在下面的語句中,xname 被解釋為到xname variable 的參考而不是到xname column的:
CREATE PROCEDURE sp1 (x VARCHAR(5))
BEGIN
DECLARE xname VARCHAR(5) DEFAULT 'bob';
DECLARE newname VARCHAR(5);
DECLARE xid INT;
SELECT xname,id INTO newname,xid
FROM table1 WHERE xname = xname;
SELECT newname;
END;
當(dāng)這個程序被調(diào)用的時候,無論table.xname列的值是什么,變量newname將返回值‘bob’。
mysql給字符串變量賦值的方法是用select into 變量結(jié)構(gòu)完成賦值。
使用sql的結(jié)構(gòu)語法:
SELECT ... INTO var_list selects column values and stores them into variables.
比如定義一個sql變量:
@x varchar(10);
@y varchar(20);
select id,name INTO @x,@y from dx_tt
這樣就完成了賦值。