新聞中心
MySQL 存儲(chǔ)過(guò)程,獲取使用游標(biāo)查詢的結(jié)果集
MySQL 存儲(chǔ)過(guò)程中,使用游標(biāo)查詢,返回的是結(jié)果集時(shí),如何查看調(diào)用存儲(chǔ)過(guò)程輸出結(jié)果呢?
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),賀州網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:賀州等地區(qū)。賀州做網(wǎng)站價(jià)格咨詢:18982081108
解決方案:存儲(chǔ)過(guò)程不返回?cái)?shù)據(jù),但它能創(chuàng)建和填充另一個(gè)表。所以在存儲(chǔ)過(guò)程運(yùn)行中創(chuàng)建臨時(shí)表。該臨時(shí)表將保存存儲(chǔ)過(guò)程中生成的結(jié)果集,在遍歷游標(biāo)時(shí),用insert保存每條數(shù)據(jù)到臨時(shí)表中。后續(xù)調(diào)用時(shí)可以用select語(yǔ)句查詢臨時(shí)表中的存儲(chǔ)過(guò)程運(yùn)行結(jié)果。
以下有 三種方式 使用游標(biāo)創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,統(tǒng)計(jì)某一部門下的員工信息
方法一:Loop循環(huán)
調(diào)用存儲(chǔ)過(guò)程:
方法二:While 循環(huán)
調(diào)用存儲(chǔ)過(guò)程:
方法三:REPEAT 循環(huán)
調(diào)用存儲(chǔ)過(guò)程:
上述三種實(shí)現(xiàn)方法在測(cè)試過(guò)程中遇到下述問(wèn)題。
調(diào)用存儲(chǔ)過(guò)程查詢臨時(shí)表輸出結(jié)果時(shí),會(huì)發(fā)現(xiàn)多循環(huán)了一次,像這樣:
解決方法:
在遍歷游標(biāo)查詢結(jié)果時(shí),先判斷游標(biāo)的結(jié)束標(biāo)志(done) 是否是為1,如果不是1,則向臨時(shí)表中插入數(shù)據(jù)。
mysql 存儲(chǔ)過(guò)程 怎么跳出游標(biāo) 循環(huán)
游標(biāo)一般與循環(huán)一起使用,可以設(shè)置一個(gè)循環(huán)結(jié)束條件來(lái)跳出循環(huán)并關(guān)閉游標(biāo)。
mysql中游標(biāo)
下面是一個(gè) MySQL 的 游標(biāo)處理的 例子代碼。 你參考參考看看。
mysql DELIMITER //
mysql CREATE PROCEDURE TestCursor()
- BEGIN
-
- DECLARE v_id INT;
- DECLARE v_value VARCHAR(10);
-
- -- 游標(biāo)控制的標(biāo)志
- DECLARE no_more_departments INT;
-
- -- 定義游標(biāo).
- DECLARE c_test_main CURSOR
- FOR
- SELECT id, value FROM test_main;
-
- -- 當(dāng)游標(biāo)沒(méi)有數(shù)據(jù)的時(shí)候
- -- 設(shè)置 no_more_departments = 1
- DECLARE CONTINUE HANDLER
- FOR
- NOT FOUND SET no_more_departments=1;
-
- -- 設(shè)置初始標(biāo)志位,認(rèn)為游標(biāo)是有數(shù)據(jù)的.
- SET no_more_departments=0;
-
- -- 打開(kāi)游標(biāo)
- OPEN c_test_main;
-
- -- 獲取游標(biāo)數(shù)據(jù)
- FETCH c_test_main INTO v_id, v_value;
-
- -- 循環(huán)所有的行
- WHILE no_more_departments = 0 DO
- -- 輸出調(diào)試信息
- SELECT v_id, v_value;
-
- -- 獲取游標(biāo)數(shù)據(jù)
- FETCH c_test_main INTO v_id, v_value;
- END WHILE;
-
- -- 關(guān)閉游標(biāo)
- CLOSE c_test_main;
- END//
Query OK, 0 rows affected (0.00 sec)
誰(shuí)有有關(guān)MYSQL游標(biāo)的知識(shí)
比較基礎(chǔ)的
可以用在存儲(chǔ)過(guò)程的SQL語(yǔ)句主要有以下類型:
1、
無(wú)返回結(jié)果語(yǔ)句,如:INSERT,UPDATE,DROP,
DELETE等
2、
select語(yǔ)句返回單行變量并可傳給本地變量(select
..into)
3、
返回多行結(jié)果集的select語(yǔ)句,并可使用游標(biāo)循環(huán)處理
注意,存儲(chǔ)過(guò)程返回的多行結(jié)果集,可以被客戶端程序(如php)所接收,但要在一個(gè)存儲(chǔ)過(guò)程中接收另一個(gè)存儲(chǔ)過(guò)程的結(jié)果集是不可能的,一般解決辦法是存入臨時(shí)表供其它過(guò)程共用
4、
prepare語(yǔ)句
以下主要講述游標(biāo)及prepare部分
游標(biāo)
定義
DECLARE
cursor_name
CURSOR
FOR
SELECT_statement;
游標(biāo)操作
OPEN
打開(kāi)游標(biāo)
OPEN
cursor_name;
FETCH
獲取游標(biāo)當(dāng)前指針的記錄,并傳給指定變量列表,注意變量數(shù)必須與游標(biāo)返回的字段數(shù)一致,要獲得多行數(shù)據(jù),使用循環(huán)語(yǔ)句去執(zhí)行FETCH
FETCH
cursor_name
INTO
variable
list;
CLOSE關(guān)閉游標(biāo)
CLOSE
cursor_name
;
注意:mysql的游標(biāo)是向前只讀的,也就是說(shuō),你只能順序地從開(kāi)始往后讀取結(jié)果集,不能從后往前,也不能直接跳到中間的記錄.
一個(gè)完整的例子:
--
定義本地變量
DECLARE
o
varchar(128);
--
定義游標(biāo)
DECLARE
ordernumbers
CURSOR
FOR
SELECT
callee_name
FROM
account_tbl
where
acct_timeduration=10800;
DECLARE
CONTINUE
HANDLER
FOR
NOT
FOUND
SET
no_more_departments=1;
SET
no_more_departments=0;
--
打開(kāi)游標(biāo)
OPEN
ordernumbers;
--
循環(huán)所有的行
REPEAT
--
Get
order
number
FETCH
ordernumbers
INTO
o;
update
account
set
allMoney=allMoney+72,lastMonthConsume=lastMonthConsume-72
where
NumTg=@o;
--
循環(huán)結(jié)束
UNTIL
no_more_departments
END
REPEAT;
--
關(guān)閉游標(biāo)
CLOSE
ordernumbers;
mysql中存儲(chǔ)過(guò)程和游標(biāo)調(diào)用問(wèn)題
不知道你 什么版本的 mysql
1、
我使用的 mysql, 好像沒(méi)有 create or replace procedure 這樣的語(yǔ)法。
只能 create procedure
可能是我的 mysql 版本太低了吧...
2、
MySQL 存儲(chǔ)過(guò)程名字后面的“()”是必須的,即使沒(méi)有一個(gè)參數(shù),也需要“()”
這個(gè)不知道是不是也是我mysql 版本太低的問(wèn)題。
create or replace procedure proc_updateDist
修改為
create procedure proc_updateDist ()
3、游標(biāo)部分, 缺少了 DECLARE CONTINUE HANDLER
以及 判斷什么時(shí)候退出循環(huán)的語(yǔ)句。
文章名稱:mysql游標(biāo)怎么跳出來(lái) MySQL定義游標(biāo)
網(wǎng)站地址:http://www.dlmjj.cn/article/hiohhg.html